| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Bogen, Linie, PL Länge Delta (854 / mal gelesen)
|
otm Mitglied Bauingenieur
Beiträge: 190 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023.2.1 Update VBA Enabler 2019 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 23. Mrz. 2022 21:06 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum, ich versuche ein Programm zu schreiben, bei dem ich - ein Objekt anklicke - wenn es eine Linie, eine PL oder ein Bogen ist, das Objekt um einen Deltawert zu verlängern bzw. zu verkürzen. Wie kann ich den Befehl "Länge" "DE" in VBA ausdrücken? Oder wie kann ich der Zeile
Code:
ThisDrawing.SendCommand "Länge DE " & dblDelta & " "
das vorher vom User angeklickte Objekt und den PickPoint angeben? ------------------ Grüße aus München Christian [Diese Nachricht wurde von otm am 23. Mrz. 2022 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rexxitall Mitglied Dipl. -Ing. Bau
Beiträge: 270 Registriert: 07.06.2013 Various: systems, Operating systems, cad systems, cad versions, programming languages.
|
erstellt am: 24. Mrz. 2022 11:27 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Hi, 1. es gibt den ACAD Befehl "_LENGTHEN" Wie der auf deutsch heißt weis ich nicht Der eigentlich so was macht. (Unterstrich vor dem englischen Kommando und es tut auch im deutschen Autocad) 2. Kannst du SENDCOMMAND das Handle des Entitys mit unterschieben Siehe: https://adndevblog.typepad.com/autocad/2012/09/using-object-id-in-sendcommand-method.htmlIm Beispiel dort wurde das Ausrunden Kommando benutzt welches zwei Handles / Entitys benutzt. Hier bastelt der ein Handle zusammen: Dim strEntName1 As String strEntName1 = "(handent """ & strHandle1 & """)" (Ob bei dir da bei HANDENT ein Unterstrich vor muss weis ich nicht) Schaden tut er nie. Diese Konstruktionen führt er dann in der Letzten Zeile aus. Hat der Gute dort zwar für .NET ausgeführt geht aber nur um die Art und Weise wie der Kommandostring zusammengebastelt wird. Also Thisdrawing.sendcommand verwenden und nicht das Net API benutzen Dim strCommand As String strCommand="_fillet" + vbCr + "r" + vbCr + "0.495" + vbCr + strEntName1 + vbCr + strEntName2 + vbCr call Thisdrawing.sendcommand(strCommand) Lieben Gruß ------------------ Wer es nicht versucht, hat schon verlorn Und bei 3 Typos gibts den vierten gratis ! <<< not for sale ! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 22298 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 24. Mrz. 2022 12:28 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Nur als Kommentar und Ergänzng. LENGTHEN ist genau der Befehl um den es in der Anfrage ging, eben der Befehl LÄNGE - Handle als Objektangabe Dem AutoCAD-Befehl sendet man nicht das Handle sondern die ObjectID des Objektes, genau dafür ist die Funktion HANDENT da, sie gibt die ObjectID des übergebenen Handle zurück. Da HandEnt eine Lispfunktion ist steht diese auch in Klammern geschrieben und benötigt keinen Unterstrich(der ist nur für AutoCAD-Befehle/Optionen). [Diese Nachricht wurde von cadffm am 24. Mrz. 2022 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
otm Mitglied Bauingenieur
Beiträge: 190 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023.2.1 Update VBA Enabler 2019 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 25. Mrz. 2022 13:03 <-- editieren / zitieren --> Unities abgeben:
Super. Genau die Infos, die mir gefehlt haben. Vielen Dank. Aber es will noch nicht richtig. Hier mein Code: Code:
Sub LengthenX() Dim returnObj As AcadObject Dim basePnt As Variant Dim iKeyCode On Error Resume Next Retry: 'Eingabe des Objekts ThisDrawing.Utility.GetEntity returnObj, basePnt, "Markierungsobjekt auswählen" iKeyCode = GetAsyncKeyState(&H1B) ' abfragen, ob ESC noch gedrückt wurde! If Err <> 0 Then Err.Clear 'Geklickt, aber nichts gewählt. If (iKeyCode And &H1B) = 1 Then 'Abbruch mit Taste "Esc" Exit Sub Else 'ins Leere geklickt GoTo Retry End If Else returnObj.Update End If ' Verlängerung/Verkürzung festlegen Dim dblDelta As Double 'Dieser Wert wird im Original berechnet. '.... dblDelta = 6 Dim strHandle As String Dim strEntName As String Dim strCommand As String strHandle = returnObj.handle strEntName = "(handent """ & strHandle & """)" strCommand = "_LENGTHEN" & vbCr & "DE" & vbCr & dblDelta & vbCr & strEntName & vbCr Call ThisDrawing.SendCommand(strCommand) End Sub
Der Befehl Länge wird ausgeführt, DE wird auch gemacht und dann wird das objekt (linie) am Startpunkt verlängert, obwohl ich in der Nähe des Endpunkts angeklickt habe. Ich kann den Pickpoint nirgends übergeben, damit klar ist auf welcher Seite die Linie verlängert werden soll. Wie geht das? Ohne diesem Artikel folgen zu müssen. [URL] https://forums.autodesk.com/t5/vba/lengthen-in-vba-without-using-sendcommand/td-p/1622493 [/URL] ------------------ Grüße aus München Christian [Diese Nachricht wurde von otm am 25. Mrz. 2022 editiert.] [Diese Nachricht wurde von otm am 25. Mrz. 2022 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2812 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 26. Mrz. 2022 12:32 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Hallo Christian, Darf ich einmal fragen warum Du das Element unbedingt vorher abfragen mußt? Wie Du schon richtig festgestellt hast kannst Du den PickPoint, der angibt an welchem Ende die Änderung erfolgen soll, nicht übergeben. D.h. entweder Du rufst den Länge-Befehl ohne das Element auf, nur mit Angabe des Deltawertes. Das ist aber Fehleranfällig (falsches Element oder doppelt klicken bevor der Abbruch erfolgt. Oder Du analysierst das Element selber und schreibst die entsprechenden Unterfunktionen für das gewählte Element. Ist aufwändig wenn man 2D/3D berücksichtigen will evtl. schräg im Raum liegende Elemente hat (Fensterbögen, Durchlässe). Sollte Dir eine einfache Funktion auf die dargestellte Ebene (Welt) in 2D helfen, könnte ich mal ein altes Programm suchen. Ich denk ich hatte da schon mal etwas geschrieben... Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
otm Mitglied Bauingenieur
Beiträge: 190 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023.2.1 Update VBA Enabler 2019 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 26. Mrz. 2022 21:21 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus, im Layernamen des Elements steckt die Information, aus der man ausrechnen kann, um welches Delta das Element gekürzt bzw. verlängert werden muss. Mittlerweile habe ich für Linien und Bögen das Kürzen und Längen für alle Fälle fertig. Nur die PL muss ich mir noch genauer ansehen. Das Verlängern ist einfach, das Kürzen weiß ich noch nicht, wie ich rangehen soll. Da ich das alles nur in 2D benötige, sollte das aber auch machbar sein. Wenn Du dazu einen alten Code hast, würde ich mich sehr freuen. ------------------ Grüße aus München Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rexxitall Mitglied Dipl. -Ing. Bau
Beiträge: 270 Registriert: 07.06.2013 Various: systems, Operating systems, cad systems, cad versions, programming languages.
|
erstellt am: 23. Jul. 2022 00:52 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Generell kann mit xyz.objectname herausbekommen um welche "Sau" es sich handelt. So man das hat bekommt man auch abhängig vom Object die Koordinaten heraus. Aus meiner Erfahrung heraus ist es zielführender und weit schneller die Dinge selber ohne ACAD API zu rechnen. Es ist auch ein genereller Weg. Koordinaten abfragen, verarbeiten, Koordinaten zuweisen. Man *kotzt* zwar zum Anfang im Strahl. Lernt aber später das es so einfacher geht. Insbesondere für andere Probleme. Ich hab mir ein "Get points_from_ENTITY" geschrieben und die Gegenseite "Set_points_to_entity". Alles was danach kommt ist "blöde" Mathematik Und kein Autocad Hexenwerk mehr. Ist auch drastisch schneller .) Ja, ich weis, um die Mathe Nummer kommt man nicht rum Aber dafür um komische Acad APIS wo kein Mensch weis wie die unter welchen Umständen entstanden sind Illegale DRogen .. Wir wissen es nicht ------------------ Wer es nicht versucht, hat schon verlorn Und bei 3 Typos gibts den vierten gratis ! <<< not for sale ! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rexxitall Mitglied Dipl. -Ing. Bau
Beiträge: 270 Registriert: 07.06.2013 Various: systems, Operating systems, cad systems, cad versions, programming languages.
|
erstellt am: 06. Okt. 2022 14:29 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Polylinie ist nicht ganz so einfach. Du musst die Koordinaten der Linie durchlaufen und herausbekommen um welches Segment es sich handelt. Die kann übrigens links oder rechts rum sein... Dann strecken und alle anderen (nachfolgenden) Punkte auch mit dieser Verschiebung beaufschlagen. Ob ein Polygon links oder rechts rum dreht bekommt man mit dem Vorzeichen der Flächenberechnung nach Gauss heraus. Thema Bulgen. Dreht man die Drehrichtung um, müssen die Bulgen angepasst werden. Vorzeichen und ggf. um einestelle verschieben. Lustig sind auch geschlossene Polygone. 2 Fälle. Polygon ist per Autocad geschlossen oder Anfangs und Endpunkt sind gleich. Weiterer Funfact. Autocad kennt 4 Polygontypen plus Faces, Splines... Mit 2 und dreidimensionalen Koordinaten. Wenn man das Fass aufmacht kann man denn auch gleich alles andere schreiben was die Deskler so vergessen haben. Dsuert nen Monat, hab ich hinter mir Ist aber cool Polygon aufknacken, Segmente einfügen, Typen umwandeln, links und rechts rum (beeinflusst manche Strichelungen) ... Wenn man da oft mit schafft lohnt das Nachrüsten solcher Funktionen. Polygon ändern im Rechteck, im Polygon. Glaub hab da 20-30 Dinge nachgerüstet. Als erstes aber 2 Routinen schreiben die diese Punkte egal was es ist ausliest und eine die egal was es ist wieder setzt.(type point3d x as double, y as double z as double, bulge as double) Sonst wirst wuschig Also Array() of point3d erzeugen und füllen. ------------------ Wer es nicht versucht, hat schon verlorn Und bei 3 Typos gibts den vierten gratis ! <<< not for sale ! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
otm Mitglied Bauingenieur
Beiträge: 190 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023.2.1 Update VBA Enabler 2019 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 07. Sep. 2023 09:34 <-- editieren / zitieren --> Unities abgeben:
|
rexxitall Mitglied Dipl. -Ing. Bau
Beiträge: 270 Registriert: 07.06.2013 Various: systems, Operating systems, cad systems, cad versions, programming languages.
|
erstellt am: 11. Sep. 2023 21:55 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Dafür nicht. Und ich bin mir ziemlich Sicher die Koordianten Bibliothek (lästiges Schreibwerk) hier schon mal gepostet zuhaben Wenn nicht PN ------------------ Wer es nicht versucht, hat schon verlorn Und bei 3 Typos gibts den vierten gratis ! <<< not for sale ! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |