Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  VBA und 3D

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:  VBA und 3D (1297 mal gelesen)
Dirk.B
Mitglied
Tischler / Leiter Arbeitsvorbereitung


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

Beiträge: 534
Registriert: 25.11.2003

erstellt am: 31. Okt. 2009 14: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


Platte_01.jpg


Platte_02.jpg

 
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


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

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 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 Dirk.B 10 Unities + Antwort hilfreich

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

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


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

Beiträge: 534
Registriert: 25.11.2003

erstellt am: 31. Okt. 2009 21:25    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 Carsten!
Hallo Alfred!

Vielen Dank für Eure Infos und Ideen.
Ist anscheinend ja nicht so einfach 

Ich werd mal das eine oder andere dazu ausprobieren.

Gruß

Dirk

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

Dirk.B
Mitglied
Tischler / Leiter Arbeitsvorbereitung


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

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 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


Test_01.jpg

 
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


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

Beiträge: 534
Registriert: 25.11.2003

erstellt am: 01. Nov. 2009 11:05    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!!

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 Next

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

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


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

Beiträge: 534
Registriert: 25.11.2003

erstellt am: 03. Nov. 2009 20:13    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


minp_maxp.jpg


Kappen.dvb.txt

 
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.


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

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 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 Dirk.B 10 Unities + Antwort hilfreich

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


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

Beiträge: 534
Registriert: 25.11.2003

erstellt am: 04. Nov. 2009 07:28    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 Wilfrid!

Danke.

Manches kann ja so einfach sein

Gruß

Dirk

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

Dirk.B
Mitglied
Tischler / Leiter Arbeitsvorbereitung


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

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

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

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