| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: VBA und 3D (1297 mal gelesen)
|
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003
|
erstellt am: 31. Okt. 2009 14:15 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen! Ich bin mal wieder dabei in VBA etwas im Bereich 3D auszuprobieren. Dieses mal geht es mir um folgendes: Ich habe eine Platte (rechwinklig). Diese soll nun anhand einer Freiformkontur getrennt werden, so als wenn ich sie durchschneiden würde. Siehe Bildchen Platte_01 sprich gelbe Linie. Mein Ziel soll ein kleines VBA - Programm sein, daß quasi folgende Schritte automatisiert: - Mit dem Befehl Umbrenzung würde ich nun von der schattierten Fläche eine Polylinie erzeugen. - Diese Polylinie würde um die Plattenstärke mit Extrusion auf die entsprechende Höhe angepaßt. - Mit Differenz würde der eine Volumenkörper von dem anderen abgezogen. Ergebnis siehe Bildchen Platte_02. Hätte da jemand einen Lösungansatz für mich? Vielen Dank im voraus. Gruß Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
Beiträge: 1357 Registriert: 24.07.2002 AutoCAD ACA 2018 Solidworks 2016 Sp5 Enterprise PDM 2016 Sp5 Pascam Woodworks Visual Studio 2017 Pro Windows 10 64Bit Dell T3620 Intel Core i7-7700K 16 GB Arbeitsspeicher 2x Samsung S24C650 Dell M4800
|
erstellt am: 31. Okt. 2009 16:06 <-- editieren / zitieren --> Unities abgeben: Nur für Dirk.B
Hallo Dirk, Woher soll das Programm wissen, auf welcher Seite was von der Platte abgeschnitten werden soll?! Ansonsten wäre ein Ansatz, die Polylinie zu extrudieren und dann ein Kappen mit Oberfläche auf die Platte anzuwenden. Dann könntest du entweder beide Platten(-hälften) behalten oder ein der beiden löschen lassen. Da es meines Wissens die Methode "Slice" im VBA nicht gibt, müsstest du die Sachen/Abfragen soweit in deinem VBA-Teil sammeln und danach mit SendCommand arbeiten. Gruß, Carsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 31. Okt. 2009 20:50 <-- editieren / zitieren -->
Hi Dirk, >> Mit dem Befehl Umbrenzung damit beginnt leider schon der erste Problempunkt, diesen Befehl gibt es nicht per API, den kannst Du nur per SendCommand oder per Lisp (command "_bpoly" ... anstarten, es gibt keinen Rückgabewert, eben alle Nachteile, die SendCommand so bringt. Hast Du die Polylinie, kannst Du diese, wie Du schon in den Folgepunkten angeführt hast, extrudieren und (nachdem der Anwender Deiner Applikation den Basisvolumenkörper geklickt hat) auch mittels '_subtract' weiterarbeiten. Also ist der Workflow, den Du genannt hast, ja auch schon ein möglicher Weg, wo hängst Du denn dabei? Ich meine damit an welchem Code? - alfred - ------------------ www.hollaus.at |
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003
|
erstellt am: 31. Okt. 2009 21:25 <-- editieren / zitieren --> Unities abgeben:
|
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003 AutoCAD 2021/2022 CAD+T HP ZBook 15 G4, 64-bit, WIN 10 Pro
|
erstellt am: 01. Nov. 2009 10:13 <-- editieren / zitieren --> Unities abgeben:
Hallo und guten Morgen zusammen! In der AutoCAD Hilfe habe ich zu dem Thema Kappen (Slice) noch folgendes gefunden: Code:
Sub Ch8_SliceABox() ' Erstellen des Quaderobjekts Dim boxObj As Acad3DSolid Dim length As Double Dim width As Double Dim height As Double Dim center(0 To 2) As Double center(0) = 5#: center(1) = 5#: center(2) = 0 length = 5#: width = 7: height = 10# ' Erstellen des Quaderobjekts (3Dsolid-Objekts) im Modellbereich Set boxObj = ThisDrawing.ModelSpace. _ AddBox(center, length, width, height) boxObj.color = acWhite ' Definieren der Schnittebene mit drei Punkten Dim slicePt1(0 To 2) As Double Dim slicePt2(0 To 2) As Double Dim slicePt3(0 To 2) As Double slicePt1(0) = 1.5: slicePt1(1) = 7.5: slicePt1(2) = 0 slicePt2(0) = 1.5: slicePt2(1) = 7.5: slicePt2(2) = 10 slicePt3(0) = 8.5: slicePt3(1) = 2.5: slicePt3(2) = 10 ' Kappen des Quaders und Ausfüllen des neuen Volumenkörpers mit Rot Dim sliceObj As Acad3DSolid Set sliceObj = boxObj.SliceSolid _ (slicePt1, slicePt2, slicePt3, True) sliceObj.color = acRed sliceObj.Highlight True ' sliceObj.Delete '###--einen der beiden Solids löschen ZoomAll End Sub
Könnte man daraus evtl. etwas ableiten? Gruß Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003
|
erstellt am: 01. Nov. 2009 11:05 <-- editieren / zitieren --> Unities abgeben:
Hi!! Nur noch mal so, unabhängig von meinem eigentlichen Anliegen. Vermutlich banal, aber wie ermittel ich die die Z - Höhe der Platte? Breite (X) und Tiefe (Y) ginge ja über GetBoundingBox. Code:
Dim returnObj As AcadObject Dim NewSolid As Acad3DSolid On Error Resume NextThisDrawing.Utility.GetEntity returnObj, basePnt, "Bitte ein Objekt auswählen" If Err <> 0 Then Err.Clear MsgBox "Programmende.", , "Objektauswahl Beispiel" Exit Sub Else If TypeName(returnObj) = "3DSOLID" Then Set NewSolid = returnObj 'Breite / Tiefe / Höhe ?????? '... '... MsgBox "Der ausgewählte Objekt - Typ lautet: " & returnObj.EntityName, _ , "Objektauswahl Beispiel" End If End If
Danke. Gruß Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 01. Nov. 2009 12:01 <-- editieren / zitieren -->
Hi, >> wie ermittel ich die die Z - Höhe der Platte ...solange die Platte horizontal liegt, der 'Deckel' der Platte parallel zum 'Boden' der Platte ist sowie beide eben sind, dann kannst Du mit SolidObj.GetBoundingBox(ExtMin, ExtMax) die Höhe des Volumenkörpers bestimmen. In alles anderen Fällen wird das zeigen der Punkte durch den Anwender wohl angebracht sein. Der Weg mit '_Slice' wird nur bei einer ebenen Schnittfläche funktionieren, wieso gehst Du nicht den Weg mit Extrude und Subtract`? - alfred - ------------------ www.hollaus.at |
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003
|
erstellt am: 03. Nov. 2009 20:13 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred! Noch mal ne Frage zu dem GetBoundingBox bei 3DSolid. Die Z - Punkte werden mit minp(2) = -5 und maxp(2) = 14 ermittelt. Somit würde der Abstand ja 19mm betragen. Wie übergebe ich dieses denn an eine Variable? Ich dachte mit der Funktion MeinDistance würde das funktioniern. Code:
... Public Function MeinDistance(FromPoint, ToPoint) As Double On Local Error Resume Next MeinDistance = Sqr((FromPoint(0) - ToPoint(0)) ^ 2 + (FromPoint(1) - ToPoint(1)) ^ 2) End Function ... Dim ZHeight As Double ... Dim MinPoint As Variant Dim minp(0 To 2) As Double Dim MaxPoint As Variant Dim maxp(0 To 2) As Double ... If TypeName(returnObj1) = "IAcad3DSolid" Then 'MsgBox ent.Volume Set NewSolid1 = returnObj1 NewSolid1.GetBoundingBox MinPoint, MaxPoint minp(0) = MinPoint(0) minp(1) = MinPoint(1) minp(2) = MinPoint(2) maxp(0) = MinPoint(0) maxp(1) = MinPoint(1) maxp(2) = MaxPoint(2) ZHeight = MeinDistance(minp(2), maxp(2)) ...???????
Oder wie kann ich die Plattestärke als Extrusionshöhe ermitteln bzw. abfragen? Gruß Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 03. Nov. 2009 20:18 <-- editieren / zitieren --> Unities abgeben: Nur für Dirk.B
Hallo Dirk, Zitat: Original erstellt von Dirk.B: .. Die Z - Punkte werden mit minp(2) = -5 und maxp(2) = 14 ermittelt. Somit würde der Abstand ja 19mm betragen. Wie übergebe ich dieses denn an eine Variable? Ich dachte mit der Funktion MeinDistance würde das funktioniern. ..
Wie wäre es mit Code: Höhe=maxp(2)-minp(2)
Die Funktion MeinDistance rechnet die 2D Strecke zwischen 2 Punkten.Wilfried Stelberg ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003
|
erstellt am: 04. Nov. 2009 07:28 <-- editieren / zitieren --> Unities abgeben:
|
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003 AutoCAD 2021/2022 CAD+T HP ZBook 15 G4, 64-bit, WIN 10 Pro
|
erstellt am: 08. Nov. 2009 18:40 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen! Vielen Dank noch mal für Eure Hilfe und Denkanstöße. Mit dem Befehl "Umgrenzung" funktioniert es so prima. Code:
... Dim AuswahlPoint As Variant Dim Pn1 As Variant Dim Pn2 As Variant ... AuswahlPoint = ThisDrawing.Utility.GetPoint(, Prompt1) Pn1 = Replace(AuswahlPoint(0), ",", ".") Pn2 = Replace(AuswahlPoint(1), ",", ".")ThisDrawing.SendCommand "_-boundary" & vbCr & Pn1 & "," & Pn2 & vbCr & vbCr ...
Bis zum nächsten mal.
Gruß Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 08. Nov. 2009 19:50 <-- editieren / zitieren -->
Hi Dirk, Du solltest Dich um die Optionen im Umgrenzungsbefehl kümmern, denn: - Du weisst so nicht, ob eine Region oder eine Polylinie erstellt wird (hängt davon ab, welche Option der Anwender ev. zuvor beim Aufruf der Umgrenzung haben wollte) - Du hast im Falle Polylinie keine Kontrolle darüber, ob Inselkontrolle aktiviert ist. Es könnte sein, dass dann mehr als eine Polylinie generiert wird. - alfred - ------------------ www.hollaus.at |