| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Multileader edaten, Position, Value (2123 mal gelesen)
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 20. Sep. 2016 10:06 <-- editieren / zitieren --> Unities abgeben:
Hi! Code:
(defun c:xx( / sel e pt ) (while (and (cond ((null (setq sel (entsel "\nSelect Multileader!"))) (princ "\nNothing select!")) ((/= (cdr (assoc 0 (entget (car sel)))) "MULTILEADER") (princ "\nWrong object, select Multileader!")) ) ) ) (if (setq e (car sel)) (progn (setq pt '()) (foreach n (vl-sort (entget e) (function (lambda(e1 e2)(< (car e1) (car e2))))) (cond ((= 110 (car n)) (princ (strcat "\nCoord: " (vl-princ-to-string (cdr n)))) (setq pt (list (nth 0 (cdr n)) (nth 1 (cdr n)))) ) ((= 302 (car n)) (if (not (vl-string-search "LEADER{" (vl-princ-to-string (cdr n)))) (progn (princ (strcat "\nHeight: " (vl-princ-to-string (cdr n)))) (setq pt (append pt (list (distof (cdr n))))) ) ) ) ((= 304 (car n)) (if (not (vl-string-search "LEADER_LINE{" (vl-princ-to-string (cdr n)))) (progn (princ (strcat "\nHeight: " (cdr n))) (setq pt (append pt (list (distof (cdr n))))) ) ) ) ) ) (if (= 3 (length pt)) (progn (entmakex (list (cons 0 "POINT") (cons 10 pt))) (princ (strcat "\nComplete Coord: " (vl-princ-to-string pt))) ) ) ) ) (princ) )
Diesen Construct habe ich mühevoll "zusammengeleimt" und funktioniert weitesgehend. Würde mich freuen ihre testet einmal und gebt bescheid falls etwas schiefläuft. Mein Problem mit den entitydatas im Multileader entity ist, "korrekt" eine Abfrage nach den angezeigten Wert(Zahl) und die Koordinaten der Fahne abzufragen. Ergebnis ist, dass ein POINT auf die koordinten von Fahne(x,y) und Wert(z) gesetzt wird. Vielleicht gibt es einen einfacheren Weg mittels COM-objekt ------------------ Gruss Dirk Blog | Adolf Spende | Infra-Feed | ÅF AB
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 20. Sep. 2016 11:30 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Nur diesen Brocken hinzuwerfen ist nicht nett, deine Zeilen erwarten einen Mleader mit ganz speziellen Voraussetzungen, diese hast du nicht beschrieben und zudem wäre das auch nicht soo toll, eine DWG wäre wohl sinniger. Und genau das ist schon der eine Punkt den ich als Feedbacl gebe: Absolut kein Fehlerfall berücksichtigt. Hat der MLeader überhaupt einen Textwert der über Distof in eine Zahl gewandelt werden kann? Was passiert wenn nicht. -Ist überhaupt ein MTextobjekt im MLeader, oder nichts oder ein Block? - Mehrzeilige MTexte - macht dich auch nicht glücklich -Was ist mit MLeader welche mehrere Führungen hat? (der Hauptleader wird angenommen, aber ich würde da besser "abbrechen" und eine Warnmeldung ausgeben) Wenn ich das Programm auch mal "spartanisch herunterbreche", und in der Eile nichts übersehe, dann bleibt eigentlich das übrig: (defun c:xy (/ E Z pt) (if (and (setq E (ssget "_:S" '((0 . "MULTILEADER")))) (setq E (entget(ssname E 0))) (setq Z (cdr(assoc 304 E))) (setq pt (list (cadr(assoc 110 E))(caddr(assoc 110 E))(distof Z))) ) (progn (princ (strcat "\nHeight: " Z)) ;(entmakex (list (cons 0 "POINT") (cons 10 pt))) (command "_.LINE" pt "0,0" "") (princ (strcat "\nComplete Coord: " (vl-princ-to-string pt))) ) (c:xy) ) (princ) )
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 20. Sep. 2016 11:44 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von cadplayer: ... Vielleicht gibt es einen einfacheren Weg mittels COM-objekt
.Net ist doch bei dir auch ein Thema, aus der API mal ein Screenshot der Möglichkeiten.
Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 381 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 20. Sep. 2016 13:48 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Sorry, ich verstehe noch nicht einmal richtig die Frage. Zitat: eine Abfrage nach den angezeigten Wert(Zahl) und die Koordinaten der Fahne abzufragen
In dem ML sind doch alle werte für die Fahne. ------------------ Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 20. Sep. 2016 17:50 <-- editieren / zitieren --> Unities abgeben:
Richtig alla Werte sind vorhanden ! Mir kam es jedoch sehr umständlig vor, die Werte so abzufragen, die Frage daher ob es vielleicht einen einfacheren Weg gibt. .net ist aufwendiger in diesem Beispiel, auch wenn du mir da widersprechen wirst Holger! Mein Beispiel zielt zunächst auf einen Mleader mit "eingebauten" Mtext (wobei ein "eingebauter" Block mit Attribut den Wert in GC302 belegt) Der Mtext ist mit einem Zahlenwert 'real ... 12.25 in GC304 belegt Die Koordinaten der Textfahne(ursprung) in GC110 belegt. Beide Angaben benötige um die koord(x/y/z) zu bekommen. ------------------ Gruss Dirk Blog | Adolf Spende | Infra-Feed | ÅF AB
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 20. Sep. 2016 18:10 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von cadplayer: Richtig alla Werte sind vorhanden ! Mir kam es jedoch sehr umständlig vor, die Werte so abzufragen, die Frage daher ob es vielleicht einen einfacheren Weg gibt.
Naja, eine andere mögliche Variante hast du ja bekommen ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 20. Sep. 2016 18:53 <-- editieren / zitieren --> Unities abgeben:
|
Meldin Mitglied
Beiträge: 381 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 21. Sep. 2016 09:17 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Mir kam es jedoch sehr umständlig vor, die Werte so abzufragen, die Frage daher ob es vielleicht einen einfacheren Weg gibt.
VL oder getpropertyvalue wären noch eine alternative die einfacher wär. ------------------ Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 30. Sep. 2016 10:28 <-- editieren / zitieren --> Unities abgeben:
Es gibt nur keine Eigenschaft für die Fahne 'Position im Com-objekt, wo der leader halt hinzeigt. Ich hab auch festgestellt, dass sich die Eigenschaften nicht entsprechend des geänderten Leaderposition ändern, sondern die Position unverändert festhält auf der ursprünglichen Position. Tips? ------------------ Gruss Dirk Blog | Adolf Spende | Infra-Feed | ÅF AB
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 381 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 30. Sep. 2016 10:49 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 30. Sep. 2016 11:01 <-- editieren / zitieren --> Unities abgeben:
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 30. Sep. 2016 12:41 <-- editieren / zitieren --> Unities abgeben:
ok, nun hab ich es hinbekommen, dass mir immer der MLeaderUrsprung ausgelesen wird Code:
(defun c:xx() (while (and (cond ((null (setq sel (entsel "\nSelect Multileader!"))) (princ "\nNothing select!")) ((/= (cdr (assoc 0 (entget (car sel)))) "MULTILEADER") (princ "\nWrong object, select Multileader!")) ) ) ) (if sel (foreach e (entget (car sel)) (if (= 10 (car e)) (setq lst (cons (cdr e) lst));;lst will hold the values you need ) ) ) (setq pt (cadr lst)) (entmakex (list (cons 0 "POINT") (cons 10 pt))) )
------------------ Gruss Dirk Blog | Adolf Spende | Infra-Feed | ÅF AB
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neurosis Mitglied dipl.ing.
Beiträge: 222 Registriert: 22.08.2006
|
erstellt am: 01. Okt. 2016 19:48 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
schau dir doch mal die objekteigenschaften und -methoden genauer an: Code: (setq en (car (entsel))) (setq obj (vlax-ename->vla-object en)) (vlax-dump-object obj t) ; IAcadMLeader: AutoCAD Multi-Leader Interface ; Property values: ; Application (RO) = #<VLA-OBJECT IAcadApplication 00000001404d3f10> ; ArrowheadBlock = "" ; ArrowheadSize = 0.18 ; ArrowheadType = 0 ; BlockConnectionType = 0 ; BlockScale = 1.0 ; ContentBlockName = "" ; ContentBlockType = 6 ; ContentType = 2 ; Document (RO) = #<VLA-OBJECT IAcadDocument 0000000054e57cb8> ; DogLegged = -1 ; DoglegLength = 0.36 ; EntityTransparency = "ByLayer" ; Handle (RO) = "257" ; HasExtensionDictionary (RO) = 0 ; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 00000000566cd8c8> ; LandingGap = 0.09 ; Layer = "0" ; LeaderCount (RO) = 1 ; LeaderLineColor = #<VLA-OBJECT IAcadAcCmColor 00000000566d25a0> ; LeaderLinetype = "ByBlock" ; LeaderLineWeight = -2 ; LeaderType = 1 ; Linetype = "ByLayer" ; LinetypeScale = 1.0 ; Lineweight = -1 ; Material = "ByLayer" ; ObjectID (RO) = 149 ; ObjectName (RO) = "AcDbMLeader" ; OwnerID (RO) = 151 ; PlotStyleName = "ByLayer" ; ScaleFactor = 1.0 ; StyleName = "Standard" ; TextAttachmentDirection = 0 ; TextBackgroundFill = 0 ; TextBottomAttachmentType = 0 ; TextDirection = 5 ; TextFrameDisplay = 0 ; TextHeight = 0.18 ; TextJustify = 1 ; TextLeftAttachmentType = 1 ; TextLineSpacingDistance = 0.3 ; TextLineSpacingFactor = 1.0 ; TextLineSpacingStyle = 1 ; TextRightAttachmentType = 1 ; TextRotation = 0.0 ; TextString = "test" ; TextStyleName = "Standard" ; TextTopAttachmentType = 0 ; TextWidth = 0.0 ; TrueColor = #<VLA-OBJECT IAcadAcCmColor 00000000566d0fe0> ; Visible = -1 ; Methods supported: ; AddLeader () ; AddLeaderLine (2) ; AddLeaderLineEx (1) ; ArrayPolar (3) ; ArrayRectangular (6) ; Copy () ; Delete () ; GetBlockAttributeValue (1) ; GetBoundingBox (2) ; GetDoglegDirection (1) ; GetExtensionDictionary () ; GetLeaderIndex (1) ; GetLeaderLineIndexes (1) ; GetLeaderLineVertices (1) ; GetVertexCount (1) ; GetXData (3) ; Highlight (1) ; IntersectWith (2) ; Mirror (2) ; Mirror3D (3) ; Move (2) ; RemoveLeader (1) ; RemoveLeaderLine (1) ; Rotate (2) ; Rotate3D (3) ; ScaleEntity (2) ; SetBlockAttributeValue (2) ; SetDoglegDirection (2) ; SetLeaderLineVertices (2) ; SetXData (2) ; TransformBy (1) ; Update ()
da haben wir eine eigenschaft TextString="test"
Code: (vlax-get-property obj 'textstring)
(wenn der text in einem block sein sollte, musst du dich mittels vla-get-contentblockname [ist etwas aufwendiger] durchhangeln.) und wir haben die methode GetLeaderLineVertices
Code: (setq array (vla-GetLeaderLineVertices obj 0)); parameter "0" bedeutet: erster leader (setq lst (vlax-safearray->list (vlax-variant-value array)))
in der variablen lst stehen zahlenwerte, die du nur noch in 3-er gruppen zusammenfassen musst, also aus (x1 y1 z1 x2 y2 z2) -> ((x1 y1 z1) (x2 y2 z2)) beispiele gibt es dafuer genuegend im netz. gruss marco
------------------ Marco Heuer www.arc-aachen.de Airport Office Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 06. Okt. 2016 07:06 <-- editieren / zitieren --> Unities abgeben:
Danke Marco zu deiner Erläuterung. Ich sollte in Zukunft mit COM so vorgehen wie du es aufgezeigt hast. Das Mleader-Interface innerhalb der Vlide-Console abzufragen ist eher unzureichend, da nicht alle Eigenschaften der Objekte angezeigt werden. Mir ist die Eigenschaft (TextString = "test") nicht unter die Augen gekommen. ------------------ Gruss Dirk Blog | Adolf Spende | Infra-Feed | ÅF AB
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 06. Okt. 2016 07:31 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 06. Okt. 2016 12:58 <-- editieren / zitieren --> Unities abgeben:
|