FastFiber

insert positie van een block benutten in lisp OPGELOST

Gestart door delangstevandestraat, ma 06 01 2014, 13:46:50

Vorige topic - Volgende topic

delangstevandestraat

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 ?
:-)
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

EddyBeerke

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
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

EddyBeerke

Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

delangstevandestraat

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
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

HofCAD

#4
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
ACADcadabra

delangstevandestraat

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 ?
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

HofCAD

#6
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.
ACADcadabra

KADANS

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

FastFiber