Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Benutzerdefinierte UCS erstellen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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


Sehen Sie sich das Profil von Benny4 an!   Senden Sie eine Private Message an Benny4  Schreiben Sie einen Gästebucheintrag für Benny4

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

erstellt am: 09. Mrz. 2009 09:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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


Sehen Sie sich das Profil von Benny4 an!   Senden Sie eine Private Message an Benny4  Schreiben Sie einen Gästebucheintrag für Benny4

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

erstellt am: 10. Mrz. 2009 09:21    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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


Sehen Sie sich das Profil von Benny4 an!   Senden Sie eine Private Message an Benny4  Schreiben Sie einen Gästebucheintrag für Benny4

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

erstellt am: 10. Mrz. 2009 09:51    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


muster.zip

 
Hi Alfred,

habe jetzt eine Zeichung angehängt, dann sollte mein Problem klarer sein.

------------------
Grüsse Benny

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 10. Mrz. 2009 10:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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


Sehen Sie sich das Profil von Benny4 an!   Senden Sie eine Private Message an Benny4  Schreiben Sie einen Gästebucheintrag für Benny4

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

erstellt am: 10. Mrz. 2009 10:15    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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


Sehen Sie sich das Profil von Benny4 an!   Senden Sie eine Private Message an Benny4  Schreiben Sie einen Gästebucheintrag für Benny4

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

erstellt am: 10. Mrz. 2009 10:38    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von CAD-Huebner an!   Senden Sie eine Private Message an CAD-Huebner  Schreiben Sie einen Gästebucheintrag für CAD-Huebner

Beiträge: 9732
Registriert: 01.12.2003

AutoCAD 20xx, Civil 3D 201x, Inventor Prof 201x usw.

erstellt am: 10. Mrz. 2009 11:15    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Benny4 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Benny4 an!   Senden Sie eine Private Message an Benny4  Schreiben Sie einen Gästebucheintrag für Benny4

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

erstellt am: 10. Mrz. 2009 11:19    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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


Sehen Sie sich das Profil von Benny4 an!   Senden Sie eine Private Message an Benny4  Schreiben Sie einen Gästebucheintrag für Benny4

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

erstellt am: 10. Mrz. 2009 14:23    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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


Sehen Sie sich das Profil von Benny4 an!   Senden Sie eine Private Message an Benny4  Schreiben Sie einen Gästebucheintrag für Benny4

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

erstellt am: 10. Mrz. 2009 15:32    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Alfred,

super danke! Glaub ich bin dir dann mal ein paar Bier schuldig... 

------------------
Grüsse Benny

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz