Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  4 Linien zu einer "Gruppe" bilden

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:  4 Linien zu einer "Gruppe" bilden (1920 mal gelesen)
The VIP
Mitglied
Technischer Zeichner


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

Beiträge: 170
Registriert: 06.09.2002

AutoCAD Mechanical 6 unter Windows XP

erstellt am: 15. Jan. 2004 17:35    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 habe vier Linien mit denen ich über ein Makro verschiedene Dinge mache (die vier Linien bilden ein Rechteck). Je nach dem für was der Konstrukteur die Linien für sein Projekt braucht werden die vier Objekte gespiegelt oder gedreht etc. (die wird über eine Eingabemaske bestimmt).

Bevor ich jetzt ewig lange Makros schreibe die in etwa wie folgt aussehen:

Code:

Set LINIE_G1 = AddLineEx(Point3D(180, 15), Point3D(2000 + MASS_A, 15))
Set LINIE_G2 = AddLineEx(Point3D(2000 + MASS_A, 15), Point3D(2000 + MASS_A, 9))
Set LINIE_G3 = AddLineEx(Point3D(2000 + MASS_A, 9), Point3D(180, 9))
Set LINIE_G4 = AddLineEx(Point3D(180, 9), Point3D(180, 15))

Set LINIE_G1 =  LINIE_G1.Mirror(Point3D(0, 0), Point3D(0, 10))
Set LINIE_G2 =  LINIE_G1.Mirror(Point3D(0, 0), Point3D(0, 10))
Set LINIE_G3 =  LINIE_G1.Mirror(Point3D(0, 0), Point3D(0, 10))
Set LINIE_G4 =  LINIE_G1.Mirror(Point3D(0, 0), Point3D(0, 10))
    ....



...möchte ich fragen ob ich diese vier Elemente als zusammengehörige Gruppe vordefinieren kann sodass ich im Makro nicht jede Linie einzeln drehen oder spiegeln lassen muss (je nach dem was gefordert ist). Ich stelle mir das wie folgt vor:

Code:

Set LINIE_G1 = AddLineEx(Point3D(180, 15), Point3D(2000 + MASS_A, 15))
Set LINIE_G2 = AddLineEx(Point3D(2000 + MASS_A, 15), Point3D(2000 + MASS_A, 9))
Set LINIE_G3 = AddLineEx(Point3D(2000 + MASS_A, 9), Point3D(180, 9))
Set LINIE_G4 = AddLineEx(Point3D(180, 9), Point3D(180, 15))
Set GRUPPE = LINIE_G1 + LINIE_G2 + LINIE_G3 + LINIE_G4

Set GRUPPE = GRUPPE.Mirror(Point3D(0, 0), Point3D(0, 10))
    ...


Kann ich eine "makro-interne" Gruppe bilden um den Programmierweg zu verkürzen?
Was müsste ich tun, wenn ich die vier Linien anschließen als Block haben wollte?

[Diese Nachricht wurde von The VIP am 15. Jan. 2004 editiert.]

[Diese Nachricht wurde von The VIP am 15. Jan. 2004 editiert.]

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

harryk
Mitglied
Projektleiter


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

Beiträge: 124
Registriert: 19.08.2003

erstellt am: 16. Jan. 2004 06: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 The VIP 10 Unities + Antwort hilfreich

Hallo,
nur ein paar ideen:

Linien oder andere Objekte in "Collections" zusammenfassen, das Handling ist recht einfach (besser als Arrays). Der Name sagt schon alles.

Für das Drehen dann eine eigene Funktion schreiben die aus dem Drehen innerhalb einer Schleife besteht. Dieser Funktion übergibst Du dann das Collection Objekt und (fast) fertig ist.

Gruss,
Harry

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

The VIP
Mitglied
Technischer Zeichner


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

Beiträge: 170
Registriert: 06.09.2002

AutoCAD Mechanical 6 unter Windows XP

erstellt am: 16. Jan. 2004 10:59    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

Ich habe mir das komplette Register Collections in der Hilfe durchgeschaut. Leider haben viele Versuche nicht zu meinem gewünschten Ergebnis geführt. Kannst du mir ein bisschen auf die Sprünge helfen?
Mein Code hat wie folgt ausgesehen (lief aber nicht durch):

Code:

Dim groupObj As AcadGroup

...

Set groupObj = ThisDrawing.Groups.Add("GLAS")
LINIEG1 = LINIEG1.Groups.Add("GLAS")
LINIEG2 = LINIEG2.Groups.Add("GLAS")
LINIEG3 = LINIEG3.Groups.Add("GLAS")
LINIEG4 = LINIEG4.Groups.Add("GLAS")


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

harryk
Mitglied
Projektleiter


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

Beiträge: 124
Registriert: 19.08.2003

erstellt am: 17. Jan. 2004 05:03    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 The VIP 10 Unities + Antwort hilfreich

den Umweg über die Gruppe kannst Du Dir sparen wenn Du hinterher eh nen Block daraus machen möchtest.

Hier der Hilfe Auszug für das Block erzeugen:

Sub Example_InsertBlock()
    ' This example creates a block containing a circle.
    ' It then inserts the block.

    ' Create the block
    Dim blockObj As AcadBlock
    Dim insertionPnt(0 To 2) As Double
    insertionPnt(0) = 0#: insertionPnt(1) = 0#: insertionPnt(2) = 0#
    Set blockObj = ThisDrawing.Blocks.Add(insertionPnt, "CircleBlock")
   
    ' Add a circle to the block
    Dim circleObj As AcadCircle
    Dim center(0 To 2) As Double
    Dim radius As Double
    center(0) = 0: center(1) = 0: center(2) = 0
    radius = 1
    Set circleObj = blockObj.AddCircle(center, radius)
 
    ' Insert the block
    Dim blockRefObj As AcadBlockReference
    insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "CircleBlock", 1#, 1#, 1#, 0)
   
    ZoomAll
   
End Sub

Gruss,
Harry

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

The VIP
Mitglied
Technischer Zeichner


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

Beiträge: 170
Registriert: 06.09.2002

AutoCAD Mechanical 6 unter Windows XP

erstellt am: 17. Jan. 2004 11:11    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

Das ist richtig, aber wahrscheinlich werde ich nur mit Gruppe arbeiten. Das mit dem Block war nur eine Idee.

Den Befehl "Gruppe" will ich verwenden, um den Programmierweg zu verkürzen damit ich nicht jedes Objekt einzeln drehen muss sondern gleich alle vier auf einmal ansprechen kann.

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

harryk
Mitglied
Projektleiter


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

Beiträge: 124
Registriert: 19.08.2003

erstellt am: 17. Jan. 2004 12: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 The VIP 10 Unities + Antwort hilfreich

das Group Objekt unterstützt drehen leider nicht (jedenfalls 2k2). Aber vielleicht hilft Dir das erstmal:

Sub Test4Linie()
Dim LineObj(0 To 3) As AcadLine
Dim startPoint(0 To 2) As Double
Dim endPoint(0 To 2) As Double
Dim RotationAngle As Double
Dim BasePoint(0 To 2) As Double
With ThisDrawing.ModelSpace
    startPoint(0) = 0#: startPoint(1) = 0#: startPoint(2) = 0#
    endPoint(0) = 500#: endPoint(1) = 0#: endPoint(2) = 0#
    Set LineObj(0) = .AddLine(startPoint, endPoint)
   
    startPoint(0) = 500#: startPoint(1) = 0#: startPoint(2) = 0#
    endPoint(0) = 500#: endPoint(1) = 500#: endPoint(2) = 0#
    Set LineObj(1) = .AddLine(startPoint, endPoint)

    startPoint(0) = 500#: startPoint(1) = 500#: startPoint(2) = 0#
    endPoint(0) = 0#: endPoint(1) = 500#: endPoint(2) = 0#
    Set LineObj(2) = .AddLine(startPoint, endPoint)

    startPoint(0) = 0#: startPoint(1) = 500#: startPoint(2) = 0#
    endPoint(0) = 0#: endPoint(1) = 0#: endPoint(2) = 0#
    Set LineObj(3) = .AddLine(startPoint, endPoint)
   
End With
BasePoint(0) = 250#: BasePoint(1) = 250#: BasePoint(2) = 0#
RotationAngle = 45 / 180 * 3.141592654
RotateGlass LineObj, BasePoint, RotationAngle

End Sub

Function RotateGlass(Lines, Base, Rotation)
For i = 0 To 3
    LineObj(i).Rotate Base, Rotation
Next i
End Function

Collection Objecte haben allerdings den Vorteil das Du nicht wie im array immer wieder neu re-dimensionieren musst wenn die Anzahl unbekannt ist aber für 4 Linien gehts erstmal auch so.

Gruss,
Harry

[Diese Nachricht wurde von harryk am 17. Jan. 2004 editiert.]

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

The VIP
Mitglied
Technischer Zeichner


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

Beiträge: 170
Registriert: 06.09.2002

AutoCAD Mechanical 6 unter Windows XP

erstellt am: 19. Jan. 2004 16:24    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

ok, also ich hab mal beides angeschaut und ein wenig rumprobiert. Ich habe mich entschieden die Block-Funktion zu verwenden. Ich zeichne die vier Linien, mache einen Block daraus und dieser wird dann gedreht oder kopiert oder wie auch immer.


Ich habe mal versucht zu diesem Block einen vorhandenen Block zu ergänzen und habe mal ganz naiv folgendes geschrieben:

Code:

Dim blockObj As AcadBlock
...
Set Block6 = blockObj.InsertBlockEx(Point3D(2000, 0), IIf(BlockInDrawing(BlName06), BlName06, BlName06 & ".dwg"))

Leider bekomme ich da eine Fehlermeldung. Ich hatte gehofft dass es reicht wenn ich den Kreis (siehe Beispiel von dir) mit dem Block ersetze. Aber der Block (der schon in der Zeichnung ist) wird nicht mitaufgenommen. Die Hilfe ist leider auch nicht besonders gut da ich nicht weiß wonach ich suchen soll. Ich habe BLOCK und ADD gesucht, finde aber keine passenden Treffer 

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

RoSiNiNo
Mitglied
Konstrukteur


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

Beiträge: 1126
Registriert: 09.10.2002

Acad 2011-deutsch, Express Tools
3ds Max 2010
Win 7-Professional
HP Workstation Z400, 6GB
GeForce GTX 470

erstellt am: 20. Jan. 2004 08:27    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 The VIP 10 Unities + Antwort hilfreich

Du kannst nicht die selbst geschriebene Funktion InsertBlockEx verwenden um einen Block in einen Block einzufügen, da musst du schon InsertBlock verwenden.

------------------
Roland

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