| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Segmentlänge eines Objektes bestimmen (1808 mal gelesen)
|
Martin Kugler Mitglied Dipl.-Ing.
Beiträge: 21 Registriert: 05.04.2005 Architecture 2009
|
erstellt am: 24. Nov. 2005 13:05 <-- editieren / zitieren --> Unities abgeben:
Hallo ! Wir wollen auf einem vorhandenen Objekt ( z.B. einer LWPolyline ) einen Punkt setzen und von diesem Punkt aus die Länge bis zum Ende des Objektes bestimmen. Funktioniert das in ACAD ? Unsere bisherigen Versuche waren leider erfolglos. Liebe Grüße Martin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 ACAD 2008 Mechanical
|
erstellt am: 24. Nov. 2005 13:09 <-- editieren / zitieren --> Unities abgeben: Nur für Martin Kugler
Randbemerkung: .. in Lisp läßt es sich rel. einfach über die vlax-curve.. Funktionen realisieren. ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Martin Kugler Mitglied Dipl.-Ing.
Beiträge: 21 Registriert: 05.04.2005 Architecture 2009
|
erstellt am: 24. Nov. 2005 13:12 <-- editieren / zitieren --> Unities abgeben:
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 ACAD 2008 Mechanical
|
erstellt am: 24. Nov. 2005 13:29 <-- editieren / zitieren --> Unities abgeben: Nur für Martin Kugler
|
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 24. Nov. 2005 14:00 <-- editieren / zitieren --> Unities abgeben: Nur für Martin Kugler
Hallo Martin, auf die schnelle gibt's da nichts. Wir verwenden eine eigene VB Klasse die Punkte auf beliebigen Stationen einer Polylinie rechnet und umgekehrt. Das zu programmieren ist aber schon ein riesen Aufwand. Ein Würgaround könnte so aussehen. - Polylinie kopieren. (Object.copy) - Polylinie an deinem Punkt brechen - Länge abfragen (object.length) Müsste man auch in VBA hinkriegen Stelli ------------------ Warum lisp'eln wenn's auch anders geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Martin Kugler Mitglied Dipl.-Ing.
Beiträge: 21 Registriert: 05.04.2005 Architecture 2009
|
erstellt am: 25. Nov. 2005 11:43 <-- editieren / zitieren --> Unities abgeben:
Hallo Stelli ! Danke für deine Antwort ! Wie breche ich denn ein Objekt an einer bestimmten Stelle? Mit ".Explode" kann ich das Objekt ja nur in seine Subentities zerlegen. Gibt es da noch eine Funktion? Liebe Grüße Martin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 ACAD 2008 Mechanical
|
erstellt am: 25. Nov. 2005 12:25 <-- editieren / zitieren --> Unities abgeben: Nur für Martin Kugler
|
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 25. Nov. 2005 12:50 <-- editieren / zitieren --> Unities abgeben: Nur für Martin Kugler
Hallo Martin, wie sehen denn deine Polylinien aus ? Wenn es nur gerade Segmente sind kannst du dir schnell eine Funktion basteln. Wenn allerdings Krümmungen drin sind wird's schwierig. Liegt der Punkt genau auf der Linien (mit Fang gesetzt) oder gar auf einem Knickpunkt? Stelli ------------------ Warum lisp'eln wenn's auch anders geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Martin Kugler Mitglied Dipl.-Ing.
Beiträge: 21 Registriert: 05.04.2005 Architecture 2009
|
erstellt am: 25. Nov. 2005 13:40 <-- editieren / zitieren --> Unities abgeben:
|
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 25. Nov. 2005 14:19 <-- editieren / zitieren --> Unities abgeben: Nur für Martin Kugler
Hallo Martin, dann bau dir doch selber eine Funktion/Klasse. Ich schreib mal ein Grundgerüst auf. Diese Daten werden für einen Punkt der Linie gespeichert
Code:
' Modul_Global ' Punkte der Linie/Polylinie Public Type Kpunkte y As Double x As Double Z As Double Richtung As Double Station As Double Bulge As Double ' Entfernung zum ersten Punkt EntfP1 As Double End Type
Rumpf der Klasse mit der Methode die Polyliniepunkte abzufüllen und zu speichern
Code:
' Klasse_Ortho Option ExplicitDim lng_AnzPunkte As Long Dim Punkte() As Kpunkte Dim Länge As Double Private Sub Class_Initialize() Dim Punkte(0) As Kpunkte lng_AnzPunkte = 0 End Sub Public Sub AddPoint(y As Double, x As Double, Bulge As Double) Dim dy As Double Dim dx As Double Dim STrecke As Double Dim Raduis As Double Dim winkel As Double Dim h As Double Dim Umfang As Double Dim Bogen As Double Dim Radius As Double Dim EntfS1 As Double lng_AnzPunkte = lng_AnzPunkte + 1 ReDim Preserve Punkte(lng_AnzPunkte) As Kpunkte Punkte(lng_AnzPunkte).y = y Punkte(lng_AnzPunkte).x = x Punkte(lng_AnzPunkte).Bulge = Bulge If lng_AnzPunkte > 1 Then ' ... dy = Punkte(lng_AnzPunkte).y - Punkte(lng_AnzPunkte - 1).y dx = Punkte(lng_AnzPunkte).x - Punkte(lng_AnzPunkte - 1).x STrecke = Sqr(dy * dy + dx * dx) '... If Punkte(lng_AnzPunkte - 1).Bulge = 0 Then 'Gerade Länge = Länge + STrecke Punkte(lng_AnzPunkte).Station = Länge Else ' Kreisbogen h = Abs((STrecke / 2) * Punkte(lng_AnzPunkte - 1).Bulge) Radius = Abs(STrecke * (1 + Punkte(lng_AnzPunkte - 1).Bulge * Punkte(lng_AnzPunkte - 1).Bulge) / (4 * Punkte(lng_AnzPunkte - 1).Bulge)) winkel = Atn((STrecke / 2) / (Radius - h)) Umfang = 2 * 3.141593 * Radius ' ... Bogen = Abs(Umfang / 400 * winkel) Länge = Länge + Bogen Punkte(lng_AnzPunkte).Station = Länge End If Else Punkte(lng_AnzPunkte).Station = 0 Punkte(lng_AnzPunkte).Bulge = Bulge End If End Sub
Übergabe der Punkte an die Klasse
Code:
Dim LinieTmp As cls_Ortho ... Punkte = obj_ACAD_Entity.Coordinates ' Punkte auf Doublefeld ReDim dbl_Punkte(UBound(Punkte)) For i = 0 To UBound(Punkte) dbl_Punkte(i) = Punkte(i) Next i For i = 0 To UBound(dbl_Punkte) Step 2 LinieTmp.AddPoint dbl_Punkte(i), dbl_Punkte(i + 1), obj_ACAD_Entity.GetBulge(Int(i / 2)) Next i If obj_ACAD_Entity.Closed Then ' ersten Punkt hinten anhängen LinieTmp.AddPoint dbl_Punkte(0), dbl_Punkte(1), 0 End If
Jetzt brauchst du dir nur noch die Funktion in die Klasse einbauen , die den Punkt auf die Liniensegmente umformt. Dafür durchläufst du in einer Schleife alle Linienteile und schaust ob der Punkt innerhalb der Linie liegt. Da in der Klasse an jedem Punkt die Station gespeichert ist hast du so sehr leicht die Länge in jede Richtung.Stelli PS: Was ist den aus dem Listindex Problem geworden ? Rückmeldungen sind immer gut ------------------ Warum lisp'eln wenn's auch anders geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Martin Kugler Mitglied Dipl.-Ing.
Beiträge: 21 Registriert: 05.04.2005 Architecture 2009
|
erstellt am: 25. Nov. 2005 14:34 <-- editieren / zitieren --> Unities abgeben:
Hallo Stelli ! Danke für die ausführliche Antwort ! Ich werde deinen Vorschlag mal ausprobieren. Das Problem mit dem ListIndex hat sich ganz schnell gelöst, nachdem ich die Zählvariable um eins verringert habe . Hätte ich ja auch selber drauf kommen können, aber die ListIndex - Funktion erzeugt wohl keine Fehlermeldung der Art "... Out of Index". Auch dafür nochmal mein ganz herzliches Dankeschön ! Liebe Grüße Martin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |