Forum:AutoCAD VBA
Thema:Volumenk��rper in Block einf��gen
Möchten Sie sich registrieren?
Wer darf antworten? Registrierte Benutzer können Beiträge verfassen.
Hinweise zur Registrierung Sie müssen registriert sein, um Beiträge oder Antworten auf Beiträge schreiben zu können.
Ihr Benutzername:
Ihr Kennwort:   Kennwort vergessen?
Anhang:    Datei(en) anhängen  <?>   Anhänge verwalten  <?>
Grafik für den Beitrag:                                                
                                                       
Ihre Antwort:

Fachbegriff
URL
Email
Fett
Kursiv
Durchgestr.
Liste
*
Bild
Zitat
Code

*HTML ist AUS
*UBB-Code ist AN
Smilies Legende
Netiquette

10 20 40

Optionen Smilies in diesem Beitrag deaktivieren.
Signatur anfügen: die Sie bei den Voreinstellungen angegeben haben.

Wenn Sie bereits registriert sind, aber Ihr Kennwort vergessen haben, klicken Sie bitte hier.

Bitte drücken Sie nicht mehrfach auf "Antwort speichern".

*Ist HTML- und/oder UBB-Code aktiviert, dann können Sie HTML und/oder UBB Code in Ihrem Beitrag verwenden.

T H E M A     A N S E H E N
rexxitall

Beiträge: 258 / 0

Various: systems, Operating systems, cad systems, cad versions, programming languages.

Ein Volumenkörper ist ein Entity. Blöcke bestehen aus Entitys. Die Frage ist wie kopiere ich ein Entity in einen BLOCK


       
Sub TEST_COPY_ENTITYS_TO_BLOCK()
    'test routine keine recursaion etc.
    Dim entity As AcadEntity
    Dim pfentity As AcadEntity
    Dim S As String
    Dim SLOPE As New CMD
    Dim block As AcadBlock
    Dim blockref As AcadBlockReference

    Dim ENT As AcadEntity
    Dim IDPAIRS
    Dim IDPAIR As AcadIdPair
   
    Dim E() As AcadEntity
    ReDim E(0)
    Dim MS As AcadBlock
    Dim M() As Double
    Dim i() As Double
    On Error Resume Next

   
    For Each entity In ThisDrawing.PickfirstSelectionSet
        If entity.objectname <> "AcDbBlockReference" Then
            Set E(0) = entity 'its more save and easy to copy them one by one
            'copy entitys to the modelspace
            Call ThisDrawing.CopyObjects(E, block, IDPAIRS)
            'map the IDPAIRS variant to the type structure
            Set IDPAIR = IDPAIRS(0)
            'Get the new entity by id of the copy
            '(in key is the id of the original)
            Set ENT = ThisDrawing.ObjectIdToObject(IDPAIR.VALUE)
            'apply the current transfomation to the copy
           
        End If
    Next
'Wichtig, sonst sieht man nix !
    ThisDrawing.REGEN acActiveViewport
    APPLICATION.UPDATE

End Sub

Die Sache hat wie so vieles eine "kleinen" Haken - Das oben funktioniert nur für Blöcke die nicht transformiert wurden. Eigentlich müsste man auch sämtliche Verdrehungen, Verschiebungen etc mitberücksichtigen. Was insbesondere bei geschachtelten Blöcken viel Freude bereitet. Habe ich hinter mir, stecken 6 Wochen Arbeit drin, funktioniert. Man benötigt einige .NET APIs um an die Transformationsmatritzen der Blöcke zu gelangen, sowie deren Inversen. Vektorrechnung sollte man Prüfungsreif können. Ferner wissen was eine Rekursion ist und wie man diese programmiert. Bei geschachtelten Blöcken darf man munter während der Rekursion Transformationsmatritzen multiplizieren. Zum Schluss wird dann die Kopie mit der finalen Transformationsmatrix behandelt und das Element ist dann zwar nun im anderen Block an der Zeichnung hat sich optisch dabei nichts geändert.

Für den Zweidimensionalen (flachen) Fall langen Blockeinfügepunkt und Blockrotation. Das ganze für den dreidimensionalen Fall auszuwalzen erspare ich mir hier. Motto: Mir hat damals auch keine Sau geholfen *lacht* Nein, es sprengt von der Codezeilenzahl, der Komplexität, der Mathematik etc. jeglichen Forenrahmen.

Übrigens die IDPAIS sind bei copyobjects sehr hilfreich. Und man findet so gut wie nix darüber...

------------------
Wer es nicht versucht, hat schon verlorn 
Und bei 3 Typos gibts den vierten gratis !
<<< not for sale !