CADsite forum

AutoCAD => Autolisp => Topic gestart door: delangstevandestraat op ma 06 01 2014, 13:46:50

Titel: insert positie van een block benutten in lisp OPGELOST
Bericht door: delangstevandestraat op ma 06 01 2014, 13:46:50
Ik had graag de xy-pos van een block gebruikt in een lisp...

Doch ik zie die niet direct staan tussen de dxf-codes...

Wie heeft die dingen verstopt? en waar ?
:-)
Titel: Re: insert positie van een block benutten in lisp
Bericht door: EddyBeerke op ma 06 01 2014, 14:52:10
Als je het met Vlisp doet kun je dit misschien gebruiken:
(vl-load-com)
(defun c:Get-Insertionpoint (/ e o inspoint pos arrayTextpos)
(setq e (car (entsel)))
(setq o (vlax-ename->vla-object e))
(setq pos (vla-get-InsertionPoint o)
arrayTextpos (vlax-variant-value pos)
inspoint (strcat
                  (rtos (vlax-safearray-get-element arrayTextpos 0) 2 2) ","
                  (rtos (vlax-safearray-get-element arrayTextpos 1) 2 2) ","
                  (rtos (vlax-safearray-get-element arrayTextpos 2) 2 2)
                )
)
(princ inspoint)
(princ)
) ;_ end of defun
Titel: Re: insert positie van een block benutten in lisp
Bericht door: EddyBeerke op ma 06 01 2014, 14:54:23
Of bedoel je dit:
http://www.autodesk.com/techpubs/autocad/acad2000/dxf/insert_dxf_06.htm
Titel: Re: insert positie van een block benutten in lisp
Bericht door: delangstevandestraat op ma 06 01 2014, 16:06:23
Ik was inderdaad aan het zoeken in de richting van dxf-codes 10.20.30 maar ik zie deze niet in mijn entity.
Misschien komt het door mijn manier van selecteren :
Ik selecteer een block door op een attrib te klikken (bestaat eigenlijk alleen maar uit attrib's), het insertiepunt van de block ligt ergens anders.

groetjes
Titel: Re: insert positie van een block benutten in lisp
Bericht door: HofCAD op ma 06 01 2014, 16:30:28
Beste Delangstevandestraat,

Zonder gebruik van Visual Lisp:

(defun c:PINS (/ ss1 p)
  (princ "\n Select the  block reference")
  (while (not ss1)
    (setq ss1 (ssget "_:S" '((0 . "INSERT"))))
    (if (not ss1)
      (princ "\n No block reference selected")
    )
  )
  (setq p (cdr (assoc 10 (entget (ssname ss1 0)))))
  (princ (strcat "\n"
(rtos (car p) 2 3)
" , "
(rtos (cadr p) 2 3)
" , "
(rtos (caddr p) 2 3)
)
  )
  (princ)
)

(defun c:PINS2 (/ Ent EntData Oke p)
  (princ "\n Select the  block reference")
  (while (not Oke)
    (while (not Ent)
      (setq Ent (entsel))
    )
    (setq EntData (entget (car Ent)))
    (if (= (cdr (assoc 0 EntData)) "INSERT")
      (setq Oke T)
      (progn (princ "\n No block reference selected")
     (setq Ent nil)
      )
    )
  )
  (setq p (cdr (assoc 10 EntData)))
  (princ (strcat "\n"
(rtos (car p) 2 3)
" , "
(rtos (cadr p) 2 3)
" , "
(rtos (caddr p) 2 3)
)
  )
  (princ)
)

Met vriendelijke groet, HofCAD CSI.

PS Zie blz. 97 en blz. 98 in:  http://images.autodesk.com/adsk/files/autocad_2012_pdf_dxf-reference_enu.pdf  (http://images.autodesk.com/adsk/files/autocad_2012_pdf_dxf-reference_enu.pdf)
Titel: Re: insert positie van een block benutten in lisp OPGELOST
Bericht door: delangstevandestraat op wo 08 01 2014, 09:09:37
Okay,
Dat doet perfect wat ik wou. :-)

Bedankt :vreegoe:

Enkel nog een vraagje langszij...

Toe nu toe deed ik mijn selectie's als volgt :


(setq ss (nentselp "Select gegevens:" ))
    (if ss
        (progn
        )
    )


Waarschijnlijk leiden alle wegen naar rome,...
Wat is het verschil, en waarom beter de ene of de andere oplossing gebruiken ?
Titel: Re: insert positie van een block benutten in lisp OPGELOST
Bericht door: HofCAD op wo 08 01 2014, 12:06:11
Beste Delangstevandestraat,

Het verschil is, dat je entsel en ssget gebruikt voor hoofd entiteiten
en nentselp voor sub entiteiten.
Bij entsel en nentselp krijg je een entiteit, en bij ssget
krijg je een selectie set met daarin een of meerdere entiteiten.

Stel je hebt van een rechthoek (getekend met het commando RECTANG)
een block gemaak!

(setq Ent1 (entsel "selecteer de block reference"))
Geeft:
(<Entity name: 7efdd020> (40.3753 40.0806 0.0))

(setq Ent1Data (entget (car Ent1)))
Geeft:
((-1 . <Entity name: 7efdd020>) (0 . "INSERT") (330 . <Entity name: 7ee02f60>)
(5 . "7C") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 .
"AcDbBlockReference") (2 . "bbrec") (10 10.0 10.0 0.0) (41 . 1.0) (42 . 1.0)
(43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))


(setq Ent2 (nentselp  "selecteer de block reference"))
Geeft:
(<Entity name: 7efdd018> (22.9922 9.26368 0.0)
((1.0 0.0 0.0 10.0) (0.0 1.0 0.0 10.0) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))
(<Entity name: 7efdd020>))

(setq Ent2aData (entget (car Ent2)))
Geeft:
((-1 . <Entity name: 7efdd018>) (0 . "LWPOLYLINE") (330 . <Entity name:
7efdd000>) (5 . "7B") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 .
"AcDbPolyline") (90 . 4) (70 . 1) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 0.0 0.0)
(40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 30.0 0.0) (40 . 0.0) (41 . 0.0)
(42 . 0.0) (91 . 0) (10 30.0 40.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0)
(10 0.0 40.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (210 0.0 0.0 1.0))

(setq Ent2bData (entget (car (car (cdr (cdr (cdr Ent2)))))))
Geeft:
((-1 . <Entity name: 7efdd020>) (0 . "INSERT") (330 . <Entity name: 7ee02f60>)
(5 . "7C") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 .
"AcDbBlockReference") (2 . "bbrec") (10 10.0 10.0 0.0) (41 . 1.0) (42 . 1.0)
(43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))

Met vriendelijke groet, HofCAD CSI.

PS Kijk ook eens in het bijgevoegde Word document naar het programma subent.
Titel: Re: insert positie van een block benutten in lisp OPGELOST
Bericht door: KADANS op do 09 01 2014, 12:28:51
Beste,

Als ik het goed verstaat kan ik via deze lisp-routines de positie van men block bepalen ten opzichte van 0,0,0.
Kan dit dan ook verwerkt worden naar een zone rastering, dwz elke zone bestaat uit een vaste opp en liggen aansluiten naast elkaar, aangeduid met X en Y-zone karakter. Het doel is deze XY-karakters uit te lezen in lijsten, zodat we vrij vlot de positie (zone op de tekening) kunnen bepalen.

alvast bedankt