Community
AutoCAD Produktfamilie - Deutsch
Das Forum für alle Fragen zu AutoCAD, LT, Architecture, Electrical, Map 3D, Mechanical, MEP, Plant 3D, Raster Design, Web App, sowie Autodesk Civil 3D und Advance Steel.
abbrechen
Suchergebnisse werden angezeigt für 
Anzeigen  nur  | Stattdessen suchen nach 
Meintest du: 

AutoCAD - benutzerdefinierte Eigenschaft abrufen (LiNear / zusätzliche Länge)

10 ANTWORTEN 10
GELÖST
Antworten
Nachricht 1 von 11
Anonymous
1074 Aufrufe, 10 Antworten

AutoCAD - benutzerdefinierte Eigenschaft abrufen (LiNear / zusätzliche Länge)

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

10 ANTWORTEN 10
Nachricht 2 von 11
cadffm
als Antwort auf: Anonymous

Wir kennen Autocad, nur wenige haben Linear, daher wäre eine DWG hilfreich!
Versuche so wenig wie möglich Objekte (1?) zu platzieren, setze die gesuchte Länge auf einen sehr eindeutigen Wert und teile uns diesen mit. Zb 4.321

Dann kann man ohne Linearkenntnisse helfen falls der Wert nicht verschlüsselt abgelegt ist.

Sebastian

Nachricht 3 von 11
m_latz
als Antwort auf: Anonymous

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

Nachricht 4 von 11
Anonymous
als Antwort auf: m_latz

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

Nachricht 5 von 11
cadffm
als Antwort auf: Anonymous
Nachricht 6 von 11
Anonymous
als Antwort auf: cadffm

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

Nachricht 7 von 11
m_latz
als Antwort auf: Anonymous

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

 

 

 

 

Nachricht 8 von 11
Anonymous
als Antwort auf: cadffm

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

Nachricht 9 von 11
Anonymous
als Antwort auf: m_latz

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

Nachricht 10 von 11
m_latz
als Antwort auf: Anonymous

@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

Nachricht 11 von 11
Anonymous
als Antwort auf: m_latz

verstehe. Vielen Dank für den Hinweis...
habe ich geändert.

Sie finden nicht, was Sie suchen? Fragen Sie die Community oder teilen Sie Ihr Wissen mit anderen.

In Foren veröffentlichen  

Autodesk Design & Make Report