Ich möchte von einer IAcadLine neben der Länge in Eigenschaft Length auch noch die zusätzliche Länge heraus bekommen, die man im Haustechnik-Programm (LiNear) setzen kann. Damit möchte ich die Möglichkeit haben, alle Linien zu highlighten, die noch keinen Wert (benutzerdefinierte Länge) zugewiesen bekommen haben. Leider finde ich keine Möglichkeit, diese benutzerdefinierte Länge zu ermitteln. Ich gehe aber davon aus, dass in der ganz normalen dwg-Datei die Länge mitgeliefert wird. Sie muss irgendwo versteckt sein. Kann mir jemand einen Tipp geben, wie ich suchen kann?
Ich habe eine Zeichnung mit nur einer Linie angefertigt. Gehe ich alle Entities durch, gibt es nur eine. Ich habe einem IAcadLine-Objekt die Entity zugewiesen und alle Eigenschaften angesehen. NIX 😞
Vielen Dank
Her das kleine Testprogramm
Sub Test()
Dim Ent As AcadEntity
Dim Zei As AcadDocument
Dim Lo As IAcadLine
Set Zei = Application.ActiveDocument
For Each Ent In Zei.ModelSpace
Set Lo = Ent
Ent.Highlight (True)
Debug.Print Lo.Length ' normale Eigenschaft LÄNGE
'a$ = InputBox("e für Ende")
'If a$ = "e" Then Exit For
Ent.Highlight (False)
Next
Set Ent = Nothing
Set Zei = Nothing
Set Lo = Nothing
End Sub
@Anonymous
Die Themenüberschrift wurde zum besseren Verständnis von @Thomas_Stuehle editiert. Original: benutzerdefinierte Eigenschaft abrufen
Gelöst! Gehe zur Lösung
Gelöst von m_latz. Gehe zur Lösung
Gelöst von cadffm. Gehe zur Lösung
Sebastian
Ich würde mir mal die EED's der Linie ansehen. Mach einfach mal in AutoCAD ein:
(entget (car (entsel)) '("*"))
und selektiere die Linie.
Wenn da Gruppen-Codes > 1000 dranhängen, dann werden die Infos in den EED's abgespeichert.
Näheres zu den EED's (Extended Entity Data) findest Du im AutoLISP Developer's Guide.
Gruß
Markus
Hallo m.latz
Zunächst herzlichen Dank für die sofortige Hilfe... Ich hatte nicht erwartet, so schnell (bzw. überhaupt) Antwort zu erhalten.
Der Tipp war super. Hier ist die Antwort von AutoCAD:
Objekt wählen: ((-1 . <Objektname: 255699ab190>) (0 . "LINE") (330 . <Objektname: 255642d5370>) (5 . "33C1") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "S____ZEICHNEN_SW") (100 . "AcDbLine") (10 136569.0 109547.0 0.0) (11 137554.0 109370.0 0.0) (210 0.0 0.0 1.0) (-3 ("LIN_AW_BT" (1071 . 5) (1071 . 0) (1071 . -1) (1071 . 0) (1000 . "") (1040 . 123.0) (1070 . 2) (1040 . 5.0) (1070 . 2) (1070 . 0) (1000 . "")) ("LIN_AW_ANS" (1071 . 5) (1070 . 0) (1070 . 0) (1071 . 2) (1000 . "") (1000 . "")) ("LIN_AW_MAT" (1071 . 5) (1000 . "") (1000 . "") (1000 . "") (1071 . 0) (1071 . -1) (1071 . -1))))
Die Lösung findet sich bei "1040", nämlich der Wert "123.0". Es ist die zusätzliche Länge, die ich eingestellt habe.
Leider ist mir der Befehl (noch) völlig fremd. Ich werde nach einer Möglichkeit suchen, diesen Wert mit VBA abzurufen. Solltest du mir dafür auch einen Hinweis geben können, wäre das Klasse.
Gruß, Lutz
getxdata Methode
http://help.autodesk.com/view/ACD/2018/ENU/?guid=GUID-330FCA31-A2A9-47F0-972D-6915B6B98426
Sebastian
Hallo CADffm,
zunächst herzlichen Dank für die sofortige Hilfe.
Anbei eine Datei mit einer Linie. Sie hat die LENGTH=1000.0 und eine zusätzlich eingestellte Länge=123.0
Von m.latz weiß ich inzwischen, dass der Wert nicht verschlüsselt ist. Man erhält ihn mit dem Befehl
(entget (car (entsel)) '("*"))
den ich leider nicht verstehe. Die Antwort ist
Objekt wählen: ((-1 . <Objektname: 255699ab190>) (0 . "LINE") (330 . <Objektname: 255642d5370>) (5 . "33C1") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "S____ZEICHNEN_SW") (100 . "AcDbLine") (10 136569.0 109547.0 0.0) (11 137554.0 109370.0 0.0) (210 0.0 0.0 1.0) (-3 ("LIN_AW_BT" (1071 . 5) (1071 . 0) (1071 . -1) (1071 . 0) (1000 . "") (1040 . 123.0) (1070 . 2) (1040 . 5.0) (1070 . 2) (1070 . 0) (1000 . "")) ("LIN_AW_ANS" (1071 . 5) (1070 . 0) (1070 . 0) (1071 . 2) (1000 . "") (1000 . "")) ("LIN_AW_MAT" (1071 . 5) (1000 . "") (1000 . "") (1000 . "") (1071 . 0) (1071 . -1) (1071 . -1))))
Darin ist die Benutzerlänge bei "1040" erkennbar -> "123.0"
Weißt du zufällig, ob bzw. wie ich mit VBA darauf zugreifen kann?
In jedem Fall bedanke ich mich herzlich.
Gruß, Lutz
Okay,
die EED die Du an ein Objeckt hängen kannst können verschiedene Applikationsnamen haben, deshalb mußt Du das so betrachten:
(-3
("LIN_AW_BT"
(1071 . 5)
(1071 . 0)
(1071 . -1)
(1071 . 0)
(1000 . "")
(1040 . 123.0)
(1070 . 2)
(1040 . 5.0)
(1070 . 2)
(1070 . 0)
(1000 . "")
)
("LIN_AW_ANS"
(1071 . 5)
(1070 . 0)
(1070 . 0)
(1071 . 2)
(1000 . "")
(1000 . "")
)
("LIN_AW_MAT"
(1071 . 5)
(1000 . "")
(1000 . "")
(1000 . "")
(1071 . 0)
(1071 . -1)
(1071 . -1)
)
)
In Deinem Fall müßtest Du also die EED's von "LIN_AW_BT" auslesen.
Mit der Info von @cadffm kannst Du jetzt ein
'Aus der Autodesk Hilfe:
' Return the xdata for the line
Dim xdataOut As Variant
Dim xtypeOut As Variant
lineObj.GetXData "LIN_AW_BT", xtypeOut, xdataOut
machen. In den zurück gegeben Variablen (array von Variants) steht dann Dein Wert an der entsprechenden Stelle.
Laß das einfach mal im Debugger laufen und schaue Dir die "Return-Werte" an.
Gruß
Markus
Hallo 🙂
Ich hab alles Nötige gefunden.
Mit dem Programm unten bekomme ich heraus, ob eine benutzerdefinierte Länge gesetzt ist und ggf. welche.
Außerdem bekomme ich noch den zweiten Wert (Höhe).
Im Test-Programm wird für alle Linien im Debug-Bereich ausgegeben: Length, Benutzer-Länge, Benutzer-Höhe
Herzlichen Dank nochmal.
Gruß, Lutz
Sub Test()
Dim Ent As AcadEntity
Dim Zei As AcadDocument
Dim L As AcadLine
Dim Xd As Variant, XData As Variant, XDataType As Variant, AppName$, N&
Set Zei = Application.ActiveDocument
AppName$ = "MY_APP"
For Each Ent In Zei.ModelSpace
If TypeOf Ent Is IAcadLine Then
Set L = Ent
Ent.GetXData "", XDataType, XData
If VarType(XDataType) <> vbEmpty Then
Debug.Print Round(L.Length, 0), XData(6), XData(8)
Else
Debug.Print L.Length, "keine LiNear-Länge zugeordnet"
End If
End If
Next
Set Ent = Nothing
Set L = Nothing
Set Zei = Nothing
End Sub
Hallo m.latz 🙂
Ich hab alles Nötige gefunden.
Mit dem Programm unten bekomme ich heraus, ob eine benutzerdefinierte Länge gesetzt ist und ggf. welche.
Außerdem bekomme ich noch den zweiten Wert (Höhe).
Im Test-Programm wird für alle Linien im Debug-Bereich ausgegeben: Length, Benutzer-Länge, Benutzer-Höhe
Herzlichen Dank nochmal.
Gruß, Lutz
Sub Test()
Dim Ent As AcadEntity
Dim Zei As AcadDocument
Dim L As AcadLine
Dim Xd As Variant, XData As Variant, XDataType As Variant, AppName$, N&
Set Zei = Application.ActiveDocument
AppName$ = "MY_APP"
For Each Ent In Zei.ModelSpace
If TypeOf Ent Is IAcadLine Then
Set L = Ent
Ent.GetXData "", XDataType, XData
If VarType(XDataType) <> vbEmpty Then
Debug.Print Round(L.Length, 0), XData(6), XData(8)
Else
Debug.Print L.Length, "keine LiNear-Länge zugeordnet"
End If
End If
Next
Set Ent = Nothing
Set L = Nothing
Set Zei = Nothing
End Sub
@Anonymous noch eine Bemerkung meinerseits.
Du liest jetzt immer alle EED's einer Linie aus:
Ent.GetXData "", XDataType, XData
Das kann auch mal ins Auge gehen, wenn noch andere EED's dranhängen, oder die Reihenfolge mal anders ist. Ich würde nur die EED's auslesen, die ich wirklich brauche. Dann bist Du sicher, daß Du das richtige liest.
Ent.GetXData "LIN_AW_BT", XDataType, XData
Der Unterschied zwischen Maschinenbau und Informatik ist, daß man im Maschinenbau nur so genau wie nötig arbeitet, in der Informatik aber so genau wie möglich. Da kostet das nämlich nix extra 😉
Gruß
Markus
Sie finden nicht, was Sie suchen? Fragen Sie die Community oder teilen Sie Ihr Wissen mit anderen.