| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Benutzerdefinierte UCS erstellen (1586 mal gelesen)
|
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 09. Mrz. 2009 09:49 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich arbeite mit VB.NET und habe folgende Schwierigkeit: Ich muss Start- und Endpunkte einiger Linien auslesen. Diese Punkte sollen aber nicht dem Weltkoordinatensystem entsprechen. Ich möchte ein eigenes UCS erstellen und die Punkte relativ zum neuen erstellten UCS auslesen. Ich habe da mit dem UcsTable und Plane gespielt, doch leider zu keinem Ziel gekommen. Auch bin ich auf die Methode setToWorldToPlane gestoßen. Weiß nicht ob mir die auch weiterhelfen kann. Bin für jeden Tipp und in diesem Fall vielleicht auch für ein bisschen Beispielcode sehr dankbar. ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 09. Mrz. 2009 19:57 <-- editieren / zitieren -->
Hi Benny, ich hätte nicht ein UCS gesetzt, wenn es nur zu Umrechnung/Projektion von Punktkoordinaten dienen soll, denn ein UCS definieren bedeutet der Datenbank von AutoCAD ein UCS hinzuzufügen (oder ein bestehendes zu modifizieren). Ich hätte eine Matrix definiert (Geometry.Matrix.xxx vielfache Definitionsmöglichkeiten) und dann die ermittelten Punkte über die Funktion .TransformBy umrechnen lassen. - alfred - ------------------ www.hollaus.at |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 10. Mrz. 2009 09:21 <-- editieren / zitieren --> Unities abgeben:
Hi Alfred, das Problem an der Sache ist, dass ich zu den bestehenden Linien, die sich irgendwie im Raum befinden, weitere Linien hinzufügen muss. Die müssen teilweise ortogonal zu bestehenden Linien sein. Deshlab war meine Idee, ein UCS bezogen auf eine bestehende Linie zu erzeugen. Dann kann ich auf Grundlage des neuen UCS relativ einfach die neue Linie hinzufügen, da ich dann nur noch in X und Y arbeiten muss. Als Gedankenansatz hatte ich die AutoCAD-Funktion _UCS 3P. Also neues UCS mit 3 Punkten. ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Mrz. 2009 09:34 <-- editieren / zitieren -->
Hi Benny, wenn Du eine Linie zeigst, dann ist UCS nicht eindeutig, mit einer Linie kannst Du nur die X-Richtung von UCS bestimmen, aber nicht mehr. Zum erstellen von neuen Linien kannst Du ein eingestelltes UCS vergessen, denn Start- und Endpunkt bei 'New DatabaseServices.Line(P1,P2)' sind als WCS-Koordinaten anzugeben. Lass mich bitte wissen, was der Hintergrund dazu ist, Du musst doch zum Fortsetzen einer Linienkonstruktion wissen, wohin Du mit der anschliessenden Linie willst. Ich tu mir schwer mit der Vorstellung, dass ich da noch nicht weiss, wohin, aber dann doch Punkte in UCS bekannt wären. (und wenn Du Code-Snippet hast, dann zeig's bitte, zum besseren Verständnis ) - alfred - ------------------ www.hollaus.at |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 10. Mrz. 2009 09:51 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 10. Mrz. 2009 10:00 <-- editieren / zitieren -->
Hi Benny, ok, die grünen Linien sehe ich, aber der Workflow/das Ziel in Deinem Programm ist mir nicht klar. Wenn Du Dein Programm startest, was soll dann passieren? Zeigst Du eine Linie oder zwei Linien um mal ein UCS erstellen zu können? Oder verlangt Dein Programm, 3 Punkte anzugeben, ...? - alfred - ------------------ www.hollaus.at |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 10. Mrz. 2009 10:15 <-- editieren / zitieren --> Unities abgeben:
Hi Alfred, ich lasse den Benutzer die gesamten Linien auswählen. das Programm sucht sich dann die Linien heraus, die ich brauche, sind in der Zeichnung rot gekennzeichnet und das klappt auch einwandfrei. Jetzt sollen noch die grünen Linien da hin. ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Mrz. 2009 10:22 <-- editieren / zitieren -->
Hi Benny, heute ist's aber nicht leicht mit mir Du zeigst alle Linien oder nur die, die Du rot markiert hast? ==>wenn rot markiert, dann habe ich diesen Schritt verstanden ==>wenn alle markiert und das Programm soll die automatisiert finden, die rot sind, dann fehlt mir die Regel dazu, nach welchen Kriterien diese zu finden sind. Wenn mal die roten Linien gefunden sind, dann sind die grünen nach welchen Kriterien zu zeichnen? ==>aus den roten die senkrechten herausfinden, eine neue grüne Linie 3*so lang drüberzeichnen? ==>die waagrechte kleine grüne Linie erstellt sich nach welchen Kriterien, ich sehe nur, dass diese am Mittelpunkt der roten/senkrechten ihren Startpunkt hat (auch da wieder nicht klar, wieso nur auf einer senkrechten roten Linie und nicht auf beiden, oder wird das händisch selektiert?) und weiters erkenne ich nicht, woraus sich die Länge dieser Linie ergibt? - alfred - ------------------ www.hollaus.at |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 10. Mrz. 2009 10:38 <-- editieren / zitieren --> Unities abgeben:
Hi Alfred, nun versuche ich mich deutlicher auszudrücken. Ich selektiere alle Linien, die roten Linien finde ich bereits, das funktioniert. -> OK Ich habe also ab jetzt ur noch mit den roten Linien zu tun. Die grünen Linien sollen dann senkrecht zu den 2 roten senkrechten Linien gezeichnet werden. Die Länge ist verschieden, kann man 18, mal 12mm sein. -> NOCH NICHT OK Zusätzlich muss ich dann noch parallel zur unteren roten Linie eine grüne Linie weiter oben zeichnen. Das Maß kann auch hier varieren. -> NOCH NICHT OK Ich hoffe jetzt ist es besser verständlich. ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9732 Registriert: 01.12.2003 AutoCAD 20xx, Civil 3D 201x, Inventor Prof 201x usw.
|
erstellt am: 10. Mrz. 2009 11:15 <-- editieren / zitieren --> Unities abgeben: Nur für Benny4
Hallo Benjamin M. Wenn dich Alfred hier so gut unterstützt, dann beschreibe doch mal die Aufgabe und das Ziel etwas allgemeiner, damit man eine bessere Vorstellung von der Aufgabe hat. Es geht meines Erachtens um Holz/Möbelteile. Benötigst du die senkrechten Linien für eine Dokumentation/Zeichnungsableitung oder für weitere konstruktive Schritte? Wurde das Bauteil von deiner Routine selbst erzeugt? Hat es direkt oder indirekt mit dem Aufsatz ProLignum (wird nach Übername von Bentley nicht mehr weiterentwickelt) zu tun? Ich würde in jedem Fall eine Unterfunktion schreiben, die die 4 Linien oder 4 Eckpunkte im WKS übergeben bekommt, und 4 oder 8 neue Punkte im WKS zurückgibt. Das Umrechnen nur mit mathematischen Funktionen (ggf. Transformby), aber keinesfalls über das Setzen des UCS. ------------------ Mit freundlichem Gruß Udo Hübner www.CAD-Huebner.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 10. Mrz. 2009 11:19 <-- editieren / zitieren --> Unities abgeben:
Hallo Udo, nein das hat mit ProLignum nichts zu tun und ja, es handelt sich um Holzteile. Das Bauteil ist ein Volumenkörper den ich in Linien zerlege. Die grünen Linien, die ich einzeichnen will werden einem CAM - System übergeben damit diese auf einer NC-Fräse gefertigt werden können. Die grünen Linien sind folgedessen die Fräswege, die ich erzeugen muss. ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Mrz. 2009 11:49 <-- editieren / zitieren -->
Hi Benny, anbei mal ein Muster, das Dir zeigt, auch ohne UCS Linien zeichnen zu können. In diesem Fall macht es Mittellinien zwischen (händisch selektierten) Linien, die gleich lang und parallel sind. Es ist kein üppiges Fehlerhandling drin, es ist nicht getestet, Zeichnungen vorher speichern, ..... Vorgehensweise (nachdem Du es eingebunden hast aufrufbar hast): a) es wird eine Objektselektion aufgerufen, in denen Du bitte Linien zeigst (z.B. die roten aus Deiner Musterzeichnung) b) Du erhältst Mittellinien zwischen diesen. Daraus kannst Du ein wenig Umgang erkennen (hoffe ich halt), dass Du ohne UCS arbeiten kannst. Code: Public Shared Sub CADde_3DLines01() Dim tAcadDoc As ApplicationServices.Document = Nothing Dim tDocLock As ApplicationServices.DocumentLock = Nothing Dim tTrAct As DatabaseServices.Transaction = Nothing Try tAcadDoc = ApplicationServices.Application.DocumentManager.MdiActiveDocument tDocLock = tAcadDoc.LockDocument tTrAct = tAcadDoc.TransactionManager.StartTransaction 'zuerst mal modelspace zum schreiben holen Dim tBlTab As DatabaseServices.BlockTable = CType(tTrAct.GetObject(tAcadDoc.Database.BlockTableId, DatabaseServices.OpenMode.ForRead, True, True), DatabaseServices.BlockTable) Dim tModSp As DatabaseServices.BlockTableRecord = CType(tTrAct.GetObject(tBlTab(DatabaseServices.BlockTableRecord.ModelSpace), DatabaseServices.OpenMode.ForWrite, True, True), DatabaseServices.BlockTableRecord) 'jetzt lassen wir uns die linien zeigen, keine filterung Dim tSelSet As EditorInput.PromptSelectionResult = tAcadDoc.Editor.GetSelection If (tSelSet IsNot Nothing) AndAlso (tSelSet.Value IsNot Nothing) AndAlso (tSelSet.Value.Count >= 2) Then 'zumindest 2 elemente muessen selektiert sein, sonst wird das hier nix 'jetzt sammeln wir mal die linien zusammen (sollten doch andere geometrietypen selektiert sein) Dim tDBObjColl As DatabaseServices.DBObjectCollection = New DatabaseServices.DBObjectCollection For Each tObjID As DatabaseServices.ObjectId In tSelSet.Value.GetObjectIds If (tObjID.IsValid) AndAlso (Not tObjID.IsErased) Then Dim tObj As DatabaseServices.DBObject = tTrAct.GetObject(tObjID, DatabaseServices.OpenMode.ForRead, False, True) If tObj.GetType.Equals(GetType(DatabaseServices.Line)) Then If CType(tObj, DatabaseServices.Line).Length > 0 Then 'ok, es handelt sich um eine linie, diese ist auch laenger als 0, also der collection hinzufuegen tDBObjColl.Add(tObj) End If End If End If Next 'jetzt haben wir die linien zusammengesammelt, jetzt pruefen wir, welche parallel sind und gleich lang sind 'finden wir eine solche konstellation, dann zeichnen wir mittellinien For i1 As Integer = 0 To tDBObjColl.Count - 1 Dim tLine1 As DatabaseServices.Line = CType(tDBObjColl.Item(i1), DatabaseServices.Line) If i1 < (tDBObjColl.Count - 1) Then For i2 As Integer = i1 + 1 To tDBObjColl.Count - 1 Dim tLine2 As DatabaseServices.Line = CType(tDBObjColl.Item(i2), DatabaseServices.Line) If Math.Abs(tLine1.Length - tLine2.Length) <= pLengthTolerance Then 'ok, linien sind gleich lang If (Math.Abs(tLine1.Angle - tLine2.Angle) <= pAngleTolerance) OrElse _ (Math.Abs(Math.Abs(tLine1.Angle - tLine2.Angle) - Math.PI) <= pAngleTolerance) Then 'ok, die linien haben auch den gleichen winkel 'also zeichnen wir jetzt die mittellinie Dim tPt1 As Geometry.Point3d = CType(tLine1, DatabaseServices.Curve).GetPointAtParameter(CType(tLine1, DatabaseServices.Curve).EndParam / 2.0) Dim tPt2 As Geometry.Point3d = CType(tLine2, DatabaseServices.Curve).GetPointAtParameter(CType(tLine2, DatabaseServices.Curve).EndParam / 2.0) Dim tNewLine As DatabaseServices.Line = New DatabaseServices.Line(tPt1, tPt2) tModSp.AppendEntity(tNewLine) tTrAct.AddNewlyCreatedDBObject(tNewLine, True) End If End If Next End If Next End If tTrAct.Commit() Catch ex As Exception Call MsgBox("Fehler aufgetreten" & vbNewLine & ex.Message) Finally If tTrAct IsNot Nothing Then tTrAct.Dispose() : tTrAct = Nothing If tDocLock IsNot Nothing Then tDocLock.Dispose() : tDocLock = Nothing End Try
End Sub
- alfred -
------------------ www.hollaus.at |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 10. Mrz. 2009 14:23 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, vielen, vielen Dank für diesen Beispielcode. Ich werde jetzt versuchen das auf meine Problematik umzusetzen. Eine Frage hätte ich da noch: Es gibt da diese Funktion myLine.GetPointAtDist. Diese gibt mir ja den den um den angegebenen Wert verschobenen Punkt auf der Linie zurück. Der Wert den ich der Funktion GetPointAtDist übergebe muss positiv sein und darf nicht größer sein als die Länge der Linie. Wenn ich aber genau das haben möchte, also einen Punkt über der Linie hinaus. Gibt es da AutoCAD Boardmittel oder muss ich das mathematsich (wie?) lösen? ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Mrz. 2009 14:30 <-- editieren / zitieren -->
Hi Benny, Zitat: ....also einen Punkt über der Linie hinaus....
...erstelle einen Vektor von Linienstart- zu -endpunkt und multipliziere diesen mit dem Faktor, um welchen Du verlängern willst. Code: Dim tVec as Geometry.Vector3D = new Geometry.Vector3D(tLine.StartPoint,tLine.EndPoint) Dim tVec2 as Geometry.Vector3D = tVec * 2
- alfred - ------------------ www.hollaus.at |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 10. Mrz. 2009 15:32 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|