Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  Koordinaten von Volumenkörpern in Blockreferenzen

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:  Koordinaten von Volumenkörpern in Blockreferenzen (1524 mal gelesen)
doubleq
Mitglied
Entwickler


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

Beiträge: 10
Registriert: 31.05.2005

AutoCAD 2015

erstellt am: 12. Feb. 2019 17:31    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,

ich habe mal wieder eine etwas knifflige AutoCAD-VBA Herausforderung.

Die Situation:
Ich habe Blöcke mit 3D-Objekten, die in der Zeichnung mehrfach in allen Raumachsen gedreht eingefügt sind.
Von den Volumenkörpern in diesen Blockreferenzen möchte ich nun den Schwerpunkt auslesen.
Mit Centroid bekomme ich den Schwerpunkt im Koordinatensystem des Blocks und muss diesen "nur" noch ins WKS umrechnen.

Beteiligt an diesem Vorgang (nach meiner Vorstellung):
- InsertionPoint (für die allgemeine Verschiebung)
- Normal (für die Ausrichtung der Z-Achse des Blocks)
- Rotation (für den Rotationswinkel um die Z-Achse)

Das wäre eigentlich in der Theorie erstmal eindeutig (Skalierungen kommen nicht vor und Spiegelungen sind zwar wichtig, aber können in einem zweiten Schritt dazu kommen).

Ferner gibt es TranslateCoordinates um irgendwie Koordinaten umzurechnen, allerdings ist da ja nur die Normale enthalten und nicht die Rotation.

Kann mir jemand mal kurz erklären wie ich so eine Umrechnung richtig mache? Ein bißchen habe ich mich schon umgeschaut hier und im Netz, aber noch keine Lösung gefunden die passt. Eine Schwierigkeit scheint wohl zu sein, dass ich mich mit quasi allen Freiheitsgraden im Raum bewege.

Ich würde mich freuen wenn ich ein paar Denkanstöße bekommen könnte. Oder jemand hat das vielleicht schonmal gelöst?

Liebe Grüße
Christian

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



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

Beiträge: 2624
Registriert: 02.05.2006

AutoCAD LandDesktop R2 bis 2004
Civil 3D 2005 - 2022
Plateia, Canalis
Visual Basic

erstellt am: 13. Feb. 2019 14:46    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 doubleq 10 Unities + Antwort hilfreich

Hi,

Zum testen habe ichgerade keine Zeit aber einen Denkanstoß vielleicht.
Du schreibst von Volumenkörpern in Blöcken. Warum nimmst Du dann nicht den/die einzelnen Blöcke und erzeugst über BlockRef.Explode wieder einen Volumenkörper. Dieser sollte dann den richtigen Centroid haben ohne dass eine Umformung nötig ist.

Gibt es denn überhaupt für Blöcke / Blockreferencen die Centroid - Eigenschaft?

Grüße
Klaus 

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

doubleq
Mitglied
Entwickler


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

Beiträge: 10
Registriert: 31.05.2005

AutoCAD 2015

erstellt am: 13. Feb. 2019 15:26    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 Klaus,

Danke für die Antwort.
Gäbe es für die Blockreferenz die Centroid-Eigenschaft wäre das ja auch schön, is aber nicht. Deshalb muss ich mir selbst die Volumenkörper in den Blöcken zusammensuchen und die Einzel-Centroids mit Koordinaten und Masse selbst aufsummieren.
Die Blöcke zu sprengen ist der Weg den ich jetzt mal beschritten habe, aber der ist destruktiv..

Lg Christian

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

rexxitall
Mitglied
Dipl. -Ing. Bau


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

Beiträge: 266
Registriert: 07.06.2013

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

erstellt am: 13. Feb. 2019 17:32    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 doubleq 10 Unities + Antwort hilfreich

Hi,
an DEM Thema habe ich mich auch schon oft und lang versucht. Sozusagen einige Wochen in Summe. Das schöne ist ja das die Blöcke notfalls auch noch Bestandteil anderer Blöcke sein können welche ja auch im Raum noch... 3DROTATE(Der Befehl Rotiert ja um alle Achsen...) .... Was die Angelegenheit na klar drastisch trivialisiert 

Also du kannst dann Vektorechnung beidhändig mit Verve schwingen und bis zur Rente hast das dann raus. Nee 

Irgendjemand hat irgendwann mir dazu mal einen Hinweis für ein .Net API gegeben. Damit Kommst du an die Transformations Matrix des Blockes ran. Als auch dessen Inverse. Die Matrix beschreibt wie der Block im 3D Raum realtiv zu seinem Eigner angeordnet wurde. Stichwort entity.transform ...

Die inverse beschreibt was man passiert wenn man den Block explodiert. Sprich die Entitys wieder zurück in den übergeordneten Block transformiert.

Das ist in .Net ein besserer Einzeiler. Man steinige mich nicht für den fürchterlichen code - Ich brauchte das neulich mal auf die Schnelle und nicht in schön. Das liegt bei mir derzeit noch alles sehr sehr roh auf der Werkbank.

Bei geschachtelten Blöcken muss man diese Transformationsmatrix nun noch jedes mal mit der des übergeordneten Blocks multiplizieren. Es ist also nicht die Gesamtmatrix sondern nur realtiv zum jeweiliegen Eigner. 


Ich hangele mich rekursiv einmal durch alle Blockreferenzen in der Zeichnung und ergänze die in VBA nicht vorhandene Transformationsmatrix über ein Dictionary.

Mit dieser Info kann man nun Entitys zwischen Blöcken kopieren, an Blöcken Entitys dazu adddieren (da habe ich sowas mal ohne .net hier gepostet) oder auf Punkte im Modelspace zugreifen usw. Oder halt einfach nur Koordinaten umrechnen.
Was bei dir ja der Fall sein dürfte.

Das Ganze klappt auch mit skalierten und gescherten , gespiegelten Blöcken. Steckt ja alles in bereits in dieser Matrix .

Einen mathematischen Einstieg in das Thema findest du auch hier
http://www.mttcs.org/Skripte/Pra/Material/vorlesung3.pdf
Die Pdfs gehen von 1-10 - Allgem. Einführung in Computergrafik sind schön gemacht 
https://www.tu-ilmenau.de/fileadmin/media/gdv/Lehre/Computergrafik_I/Uebung/gdv1gt.pdf


'This Funtion return the Product of
'MatrixA MatrixB
'The Product of two Matrix will get one Matrix
'that dose the same as use TransformBy
'with bouth matrix
Public Function MatrixProduct(MatrixA, MatrixB)
    Dim M, n1, n2, R, I, j, j1 As Long
    Dim Product() As Double
    M = UBound(MatrixA, 1)
    n1 = UBound(MatrixA, 2)
    n2 = UBound(MatrixB, 1)
    R = UBound(MatrixB, 2)
    If n1 <> n2 Then Exit Function
    ReDim Product(M, R)
    For I = 0 To M
        For j = 0 To R
            Product(I, j) = 0
            For j1 = 0 To n1
                Product(I, j) = Product(I, j) + (MatrixA(I, j1) * MatrixB(j1, j))
            Next
        Next
    Next
    MatrixProduct = Product
End Function

Sub MATRIX_DBG(MAT() As Double)
    'debug.print
    'debug.print MAT(0, 0), MAT(0, 1), MAT(0, 2), MAT(0, 3)
    'debug.print MAT(1, 0), MAT(1, 1), MAT(1, 2), MAT(1, 3)
    'debug.print MAT(2, 0), MAT(2, 1), MAT(2, 2), MAT(2, 3)
    'debug.print MAT(3, 0), MAT(3, 1), MAT(3, 2), MAT(3, 3)
End Sub

Sub matrix_test()
    Dim tmatrix As New slope64.matrix
    Dim ENTITY As AcadEntity
    Dim HANDLE As String
    For Each ENTITY In ThisDrawing.PickfirstSelectionSet
        If LCase(ENTITY.objectname) = "acdbblockreference" Then
            HANDLE = ENTITY.HANDLE
            GoTo weiter
        End If
    Next
    Exit Sub
weiter:

    HANDLE = "85D"

'    Dim tmatrix As New slope64.matrix
    tmatrix.HANDLE = HANDLE
    tmatrix.init_matrix
    Dim I As Long
    Dim MAT(0 To 3, 0 To 3) As Double
    Dim INV(0 To 3, 0 To 3) As Double
   
    I = 0
    MAT(0, 0) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(0, 1) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(0, 2) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(0, 3) = tmatrix.get_block_transform_matrix(I): I = I + 1
 
    MAT(1, 0) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(1, 1) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(1, 2) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(1, 3) = tmatrix.get_block_transform_matrix(I): I = I + 1
   
    MAT(2, 0) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(2, 1) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(2, 2) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(2, 3) = tmatrix.get_block_transform_matrix(I): I = I + 1
   
    MAT(3, 0) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(3, 1) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(3, 2) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(3, 3) = tmatrix.get_block_transform_matrix(I): I = I + 1
   
    'debug.print
   
    'debug.print MAT(0, 0), MAT(0, 1), MAT(0, 2), MAT(0, 3)
    'debug.print MAT(1, 0), MAT(1, 1), MAT(1, 2), MAT(1, 3)
    'debug.print MAT(2, 0), MAT(2, 1), MAT(2, 2), MAT(2, 3)
    'debug.print MAT(3, 0), MAT(3, 1), MAT(3, 2), MAT(3, 3)
   
   
    I = 0
    INV(0, 0) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(0, 1) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(0, 2) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(0, 3) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
 
    INV(1, 0) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(1, 1) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(1, 2) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(1, 3) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
   
    INV(2, 0) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(2, 1) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(2, 2) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(2, 3) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
   
    INV(3, 0) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(3, 1) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(3, 2) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(3, 3) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
   
   
    Dim P As Point3d
    Dim p2 As Point3d
 
    p2 = POINT_TRANSFORM(P, MAT())
    'debug.print p2.x
    'debug.print p2.y
    'debug.print p2.z
 
   
   
End Sub

Function POINT_TRANSFORM(POINT As Point3d, MAT() As Double) As Point3d
    Dim RES As Point3d
    RES.x = POINT.x * MAT(0, 0) + POINT.y * MAT(0, 1) + POINT.z * MAT(0, 2) + MAT(0, 3)
    RES.y = POINT.x * MAT(1, 0) + POINT.y * MAT(1, 1) + POINT.z * MAT(1, 2) + MAT(1, 3)
    RES.z = POINT.x * MAT(2, 0) + POINT.y * MAT(2, 1) + POINT.z * MAT(2, 2) + MAT(2, 3)
    RES.INFO = POINT.INFO
    POINT_TRANSFORM = RES
End Function

Function ARRAY_from_string(S As String) As Double()
    Dim ARR() As Double
    Dim ROWS() As String
    Dim COLS() As String
    ROWS = split(S, vbLf)
    COLS = split(ROWS(0), vbTab)
    ReDim ARR(UBound(ROWS), UBound(COLS))
   
    For I = LBound(ROWS) To UBound(ROWS)
        COLS = split(ROWS(I), vbTab)
        For j = LBound(COLS) To UBound(COLS)
            ARR(I, j) = val(COLS(j))
        Next
    Next
    ARRAY_from_string = ARR
End Function

Function ARRAY_to_string(MAT() As Double) As String
    Dim out As New cStringBuilder
    For I = LBound(MAT, 1) To UBound(MAT, 1)
        For j = LBound(MAT, 2) To UBound(MAT, 2)
            out.Append (Trim(str((MAT(I, j)))))
            If j <> UBound(MAT, 2) Then out.Append vbTab
        Next
        If I <> UBound(MAT, 1) Then out.Append vbLf
    Next
    ARRAY_to_string = out.toString
End Function

Sub block_matrix_recursive(BLOCKREF As AcadBlockReference, c As Long, MAT() As Double, INV() As Double, DICT As DICTIONARY_VBA, SM As String, SI As String)
    Dim layertext As String
   
    Dim BNAME As String
    Dim block As AcadBlock
    Dim ENTITY As AcadEntity
   
    Dim M() As Double
    Dim I() As Double
   
    BNAME = BLOCKREF.NAME
   
    If DICT.Exists(BLOCKREF.NAME) Then Exit Sub
    DICT.Add BLOCKREF.NAME, BNAME
   
    'debug.print BNAME, c, Blockref.HANDLE, Blockref.effectivename
     
   
    If c = 0 Then
        Call entity_get_matrix(BLOCKREF.HANDLE, MAT(), INV())
        Call Entity_Set_EXT(BLOCKREF, "MAT", "")
        Call Entity_Set_EXT(BLOCKREF, "INV", "")
        Call Entity_Set_EXT(BLOCKREF, "MAT_PRD", "")
        Call Entity_Set_EXT(BLOCKREF, "INV_PRD", "")
        SM = ARRAY_to_string(MAT)
        SI = ARRAY_to_string(INV)
    Else
        Call entity_get_matrix(BLOCKREF.HANDLE, M(), I())
     
        SM = SM & vbCr & ARRAY_to_string(M)
        SI = SI & vbCr & ARRAY_to_string(I)
        'note: the multiply order is important A*B <> B*A !
        MAT = MatrixProduct(MAT, M) 'to be checked if it doesnt has to be (M,MAT)
        INV = MatrixProduct(I, INV) 'working the new matrix has to be multiply with the existing one
    End If
    c = c + 1
   
    Call Entity_Set_EXT(BLOCKREF, "MAT", SM)
    Call Entity_Set_EXT(BLOCKREF, "INV", SI)
   
    Call Entity_Set_EXT(BLOCKREF, "MAT_PRD", ARRAY_to_string(MAT))
    Call Entity_Set_EXT(BLOCKREF, "INV_PRD", ARRAY_to_string(INV))
   

    Set block = ThisDrawing.BLOCKS.ITEM(BNAME)
    For Each ENTITY In block
        If ENTITY.objectname = "AcDbBlockReference" Then
            Set BLOCKREF = ENTITY
            If ENTITY.objectname = "AcDbBlockReference" Then
                Call block_matrix_recursive(BLOCKREF, c, MAT, INV, DICT, SM, SI)
            End If
        End If
    Next
           
End Sub


Sub entity_get_matrix(HANDLE, MAT() As Double, INV() As Double)
    Dim tmatrix As New slope64.matrix
    tmatrix.HANDLE = HANDLE
    tmatrix.init_matrix
    Dim I As Long
    ReDim MAT(0 To 3, 0 To 3) As Double
    ReDim INV(0 To 3, 0 To 3) As Double
   
    I = 0
    MAT(0, 0) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(0, 1) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(0, 2) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(0, 3) = tmatrix.get_block_transform_matrix(I): I = I + 1
 
    MAT(1, 0) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(1, 1) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(1, 2) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(1, 3) = tmatrix.get_block_transform_matrix(I): I = I + 1
   
    MAT(2, 0) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(2, 1) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(2, 2) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(2, 3) = tmatrix.get_block_transform_matrix(I): I = I + 1
   
    MAT(3, 0) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(3, 1) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(3, 2) = tmatrix.get_block_transform_matrix(I): I = I + 1
    MAT(3, 3) = tmatrix.get_block_transform_matrix(I): I = I + 1
   
   
   
   
    I = 0
    INV(0, 0) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(0, 1) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(0, 2) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(0, 3) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
 
    INV(1, 0) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(1, 1) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(1, 2) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(1, 3) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
   
    INV(2, 0) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(2, 1) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(2, 2) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(2, 3) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
   
    INV(3, 0) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(3, 1) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(3, 2) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
    INV(3, 3) = tmatrix.get_block_transform_matrix_inverse(I): I = I + 1
   
   
End Sub

VB.NET Erweiterung - Steinigt  mich mir egal !:


Option Compare Text
Option Strict Off

Imports System.IO
Imports AcadApplication = Autodesk.AutoCAD.ApplicationServices.Application
Imports AcadDocument = Autodesk.AutoCAD.ApplicationServices.Document
Imports AcadWindows = Autodesk.AutoCAD.Windows
Imports acApp = Autodesk.AutoCAD.ApplicationServices.Application
Imports AcWindowsNS = Autodesk.AutoCAD.Windows
'Imports Autodesk.AutoCAD.Interop
Imports Autodesk.AutoCAD.Runtime
Imports MgdAcApplication = Autodesk.AutoCAD.ApplicationServices.Application
Imports MgdAcDocument = Autodesk.AutoCAD.ApplicationServices.Document
Imports MgdAcDB = Autodesk.AutoCAD.ApplicationServices.DatabaseExtension
Imports VB6 = Microsoft.VisualBasic
Imports VB7 = Microsoft.VisualBasic
Imports WIN32 = Microsoft.Win32
Imports Microsoft.VisualBasic
Imports System.Runtime.InteropServices
Imports System.Text
Imports Microsoft.Win32
Imports Autodesk.AutoCAD.Geometry


<ComClass(MATRIX.ClassId, MATRIX.InterfaceId, MATRIX.EventsId)>
Public Class MATRIX

#Region "COM-GUIDs"
    ' Diese GUIDs stellen die COM-Identität für diese Klasse
    ' und ihre COM-Schnittstellen bereit. Wenn Sie sie ändern, können vorhandene
    ' Clients nicht mehr auf die Klasse zugreifen.
    Public Const ClassId As String = "cdc7e7ed-c096-4d67-bef1-6c6a6cc73c0b"
    Public Const InterfaceId As String = "5c3ac512-0f92-4c5a-b32f-c4b43996ab4e"
    Public Const EventsId As String = "293d685c-2bb1-46ce-a9a0-515740f9c21e"
#End Region

    ' Eine erstellbare COM-Klasse muss eine Public Sub New()
    ' ohne Parameter aufweisen. Andernfalls wird die Klasse
    ' nicht in der COM-Registrierung registriert und kann nicht
    ' über CreateObject erstellt werden.
    Public Sub New()
        MyBase.New()
    End Sub

    Private M_Block_Name As String
    Private M_Block_Handle As String
    Private p_mat(15) As Double
    Private p_inv(15) As Double


    Private P_Handle As String
    Public Property Handle As String
        Get
            Return P_Handle
        End Get
        Set
            P_Handle = Value
        End Set
    End Property

    Public Function init_matrix() As String

        If Len(P_Handle) = 0 Then Exit Function


        Dim db As Autodesk.AutoCAD.DatabaseServices.Database = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database
        Dim ln As Long = Convert.ToInt64(P_Handle, 16)        ' Not create a Handle from the long integer
        Dim hn As Handle = New Handle(ln)                ' And attempt to get an ObjectId for the Handle

        Dim OID As ObjectId = db.GetObjectId(False, hn, 0)
        'Dim db As Autodesk.AutoCAD.DatabaseServices.Database = HostApplicationServices.WorkingDatabase
        'Dim ed As Editor = MgdAcApplication.DocumentManager.MdiActiveDocument.Editor
        Dim i As Long
        For i = 0 To 15
            p_mat(i) = 0
            p_inv(i) = 0
        Next
        Try

            Using tr As Transaction = db.TransactionManager.StartTransaction()
                Dim ent As BlockReference = CType(tr.GetObject(OID, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead), BlockReference)

                Dim mat As Matrix3d = ent.BlockTransform
                Dim inv As Matrix3d = ent.BlockTransform.Inverse()
                p_mat = mat.ToArray()
                p_inv = inv.ToArray()
                tr.Commit()
            End Using

        Catch ex As System.Exception
            'ed.WriteMessage(ex.ToString())
        End Try
    End Function
    Public Function get_block_transform_matrix(i As Long) As Double
        Return p_mat(i)
    End Function
    Public Function get_block_transform_matrix_inverse(i As Long) As Double
        Return p_inv(i)
    End Function
end class

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

doubleq
Mitglied
Entwickler


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

Beiträge: 10
Registriert: 31.05.2005

AutoCAD 2015

erstellt am: 21. Mrz. 2019 18: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

Hi rexxitall,

vielen Dank für die ausführliche Antwort! Ich habe mir das angesehen, dann aber beschlossen, dass das im Verhältnis Aufwand zu Nutzen zu aufwändig ist. Meine Lösung ist nun, dass ich die Blöcke einfach rekursiv sprenge und sie dann mit einheitlichem Koordinatensystem habe. Ist von der Performance gerade bei größeren Baugruppen leidlich (dauert bis zu 30 Sekunden), aber wenn ich das nun ein oder zweimal pro Woche brauche ist das absolut okay.

Ich habe gerade schon wieder so ein Problem bei dem ich in die Vektorrechnung einsteigen muss - vielleicht mache ich das Fass doch bald mal noch auf  .

Liebe Grüße
Christian

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

rexxitall
Mitglied
Dipl. -Ing. Bau


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

Beiträge: 266
Registriert: 07.06.2013

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

erstellt am: 22. Mrz. 2019 11:02    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 doubleq 10 Unities + Antwort hilfreich

Moin, Ja die Sach midde Vektorrechnung ... Hatte ich im Studium auch mal und da wir auch noch andere Mathe Sachen in der Klausur hatten, habe ich mich halt auf Differential gestürzt und Vektoren ignoriert. In der Klausur stand dann frech bei der Vektoraufgabe: Ach! das kann man also damit rechnen  ... Es hat mich trotzdem eingeholt ! Der Code oben funktioniert übrigens. Der Aufwand besteht also darin den einmal zum Laufen zu bringen. Das mit dem Explodieren mache ich bislang auch noch so. Bislang. Nur dauert dieser Vorgang bei mir nebst dem wieder zusammen klaubt 1-2 Minuten und kommt bei mir täglich vor. Ist also grober Unfug. Momentan bevorzuge ich eine Art mixed programming. Das was VBA nicht bietet wird halt tapfer mit einer VB.NET COM Dll nachgereicht.  Da merkt man denn zwar ständig was .NET für ein übles Geraffel ist aber mitunter der einzige gangbare Weg wenn man den Lisp Interpreter auch nicht ansprechen kann. (Gibt ein paar Dinge da kommt man mit LISP ran). Wenn du Sachen aus Blöcken raus haben willst kann man noch explodieren. Lustiger wird es wenn man in geschachtelten Blöcken etwas neu rein haben will oder deren Einfügepunkt ändern möchte... Die Beschäftigung mit den Transformationsmatrizen bietet da echte Vorteile. Gleiches gilt für das massive Ändern von Koordinaten  . Da mir unverständlicherweise bei .NET ein gewisser HYPE besteht gibt es gerade auf GITHUB viele Dinge zum öhm "borgen" und "lernen"  (Scherz das auf Githun ost open source). Da dort sehr viel in C# gemacht wird kann ich "Instant VB von  Tangible Software Solutions." wärmstens empfehlen. Der Konverter funktioniert sehr gut und ist jeden Cent wert. Die Freeware Version ist zwar auf 200 Zeilen Code  beschränkt, langt aber für viele Codeschnipsel die man im Web so findet. Z.B. bei "Trough the Interface".  Lieben Gruß Thomas

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


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

Beiträge: 266
Registriert: 07.06.2013

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

erstellt am: 22. Mrz. 2019 13:38    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 doubleq 10 Unities + Antwort hilfreich

Ah ich hatte vergessen wozu ich das nun *derzeit* benutze  . Ich habe eine Routine die innerhalb eines mehrfach geschachtelten Blockes arbeitet, aber Koordinaten Werte von Elementen aus dem Modelspace benötigt. Diese Koordinaten müssen so "umgedinxelt" werden, das sie im Block lokale Koordinaten ergeben. Da hilft mir die Dynamitstange herzlich wenig und vom Laufzeitverhalten ist das auch völlig indiskutabel. Die Explosionsarie ist auch nicht so prall, da man dann Elemente die man nicht explodiert haben will, nach der Explosion aus deren Überresten löschen muss. Ich "träum" eher davon, eine Kopie des zu "detonierenden" direkt im Modelspace zu erzeugen und dann so umzutransformieren, das es deckungsgleich mit dem Element im Block ist. Aber derzeit beschäftige ich mich gerade mit "Punktwolken" und Octrees.(Auch ein schönes Thema). Mal guggen wann die Explosionmsvermeidung mal wieder "Prio " bekommt Lieben Gruß Thomas

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

Brischke
Ehrenmitglied V.I.P. h.c.
CAD on demand GmbH



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

Beiträge: 4171
Registriert: 17.05.2001

ACAD20XX, defun-tools

erstellt am: 22. Mrz. 2019 13:39    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 doubleq 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von rexxitall:
... Wenn du Sachen aus Blöcken raus haben willst kann man noch explodieren. Lustiger wird es wenn man in geschachtelten Blöcken etwas neu rein haben will ...

Wo hast du da ein Problem?
Für beide Fälle genügt es die Elemente innerhalb der Blockdefinition zu manipulieren, dabei ist die Verschachtelungstiefe egal.
Zitat:
Original erstellt von rexxitall:
... oder deren Einfügepunkt ändern möchte ...

Auch in diesem Fall, genügt es die Elemente in der Blockdefinition zu manipulieren. für eine Verschiebung des Basispunkts, sind dann die Elemente der Blockdefinition um entgegengesetzt des Vektors der gewünschten Änderung des Basispunkts zu verschieben. Auch dabei ist die Verschachtelungstiefe vollkommen unerheblich.

Will man eine verschachtelte Blockreferenz aus einer Blockreferenz nach oben in den Modellbereich holen, ist das über eine einfache while-Schleife möglich. Die Blockreferenz ist dann lediglich je Schleifendurchgang mit der BlockTransform-Matrix der übergeordneten Referenz zu transformieren.

Ich denke, wenn man den Zusammenhang von Block und Blockdefinition verinnerlicht hat, wird man feststellen, dass es höchst selten von Bedeutung ist, die Verschachtelungstiefen der Blockreferenzen zu kennen.


Vielleicht liegt's ja am üblen VBA-Geraffel, dass das alles so aufwändig wirkt? 

Grüße!
Holger

------------------
Holger Brischke
CAD on demand GmbH
Individuelle Lösungen von Heute auf Morgen.


defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!


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

rexxitall
Mitglied
Dipl. -Ing. Bau


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

Beiträge: 266
Registriert: 07.06.2013

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

erstellt am: 25. Mrz. 2019 10:19    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 doubleq 10 Unities + Antwort hilfreich

Lieber Holger

er faselt wirr  Zur Info, die APIs die die Transformationsmatritzen enthalten welche angeben wie ein BLOCK zu transformieren ist um in einer Blockreferenz angezeigt zu leben gibt es nicht. Die habe ich mit dem .NET Geraffel nachgerüstet. In manchen wenigen Belangen ist VBA sicherlich unzureichend ausgestattet. In sehr wenigen. Betrachte ich hingegen den Coding Aufwand (3 mal mehr Codezeilen und völlig unlesbar - dagegen ist selbst ARX C eine Offenbarung in Sachen Einfachheit und Klarheit) und den Aufwand bei jeder popeligen Änderung an einer .NET Dll das Autocad neu zu starten ( Es gibt zwar ein Netload aber kein Netunload.) frage ich mich bis heute was für mieses Kraut die Entwickler bei Autodesk und Microsoft geraucht haben als sie das entwarfen.

Aber sicher wolltest du mir nur mitteilen, was für ein brillianter .Net experte du doch bist oder ? Ich betreibe kein "CAD Studio" , Ich studiere CAD nicht, ich wende es an. Meine Knete verdiene ich nicht mit der Programmierung sondern mit Brücken. Und ich bin heile froh niemanden ständig fragen zu müssen ob er mir was "hinstudiert". Das kann ich Gott sei es gedankt, selber :P *grinst*
Lieben Gruß Thomas

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

Brischke
Ehrenmitglied V.I.P. h.c.
CAD on demand GmbH



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

Beiträge: 4171
Registriert: 17.05.2001

ACAD20XX, defun-tools

erstellt am: 02. Apr. 2019 15:02    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 doubleq 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von rexxitall:
Lieber Thomas,

gerne beantworte ich dir deine Frage:
... Aber sicher wolltest du mir nur mitteilen, was für ein brillianter .Net experte du doch bist oder ?...



Nein, das wollte ich nicht! Denn ich bin sicher kein .Net Experte. Zudem bin ich der Meinung, dass die Programmiersprache nahezu unerheblich für die Programmierung ist. Bedeutend ist die Idee der Lösung. Für die Idee der Lösung spielen natürlich die durch die API zur Verfügung stehenden Möglichkeiten eine Rolle.
Aus diesem Grund habe ich im fachlichen Teil meiner Antwort ohne Bezug auf eine Programmiersprache geantwortet.
Einen spaßigen Bezug auf die von dir favorisierte Programmiersprache habe ich lediglich im letzten Satz genommen - lustig nur, dass du den Inhalt des spaßig gemeinten Satz mit deinem letzten Post bestätigst.

Im übrigen ist es mir völlig egal, mit welcher Programmiersprache du dir Lösungen erstellst!
Du hast allerdings, und das ist mir nicht egal, einige subjektive Aussagen getroffen!
Fakt ist: die .Net-API stellt sehr viele Möglichkeiten bereit, ohne dass man gleich mit C loslegen muss - mehr als VBA oder Lisp.
Ein jeder Code ist lesbar, sofern man etwas Erfahrung in der Sprache des Codes hat, sogar Lisp!
Ob man für eine Teillösung 10 oder 3 Zeilen benötigt, liegt nicht grundsätzlich an der Programmiersprache. Natürlich spielen die durch die API bereitgestellten Funktionen dabei eine Rolle. Der Overhead ist auf .Net-Seite logischerweise größer - mit den richtigen Strategien, schreibt man den allerdings nur einmal.

Warum du mitteilst, womit du dein Geld verdienst, kann ich nur vermuten - imgrunde spielt das aber auch keine Rolle. Falls es dich interessiert: ich habe das Programmieren nicht studiert, nicht mal im Entferntesten - ich bin also reiner Autodidakt.

Grüße!
Holger

------------------
Holger Brischke
CAD on demand GmbH
Individuelle Lösungen von Heute auf Morgen.


defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!


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

rexxitall
Mitglied
Dipl. -Ing. Bau


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

Beiträge: 266
Registriert: 07.06.2013

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

erstellt am: 02. Apr. 2019 18:32    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 doubleq 10 Unities + Antwort hilfreich

Holger, ich erstelle meine Anwendungen mit einem Mix aus 8 Programmiersprachen. Da bin ich sehr pragmatisch. Wenn ne Fortran Routine es tut wird die halt tapfer in ne DLL entwickelt und von dort aus benutzt. (Ehe ich mich da wochenlang mit befasse das umzucodieren.) Manche Sachen funktionieren auch im Browser besser. Javascript ist da echt Kumpel. Ich habe im Laufe meines Lebens viele Programmiersprachen und APIS benutzt. Aber das mit weitem Abstand bekloppteste ist das von .NET . Und um deine Frage zu beantworten ich bin Bauingenieur im konstruktiven Ingenieurbau. Brücken, Hallen, Kläranlagen, Kernkraftwerke, Stützwände, Baugruben. So Zeug halt. Und da bist was fertige Lösungen anbetrifft, aufgeschmissen. Für den sehr beschränkten Markt entwickelt keiner. Und wenn, gehen dem deutsche Normen quer am Arm vorbei oder sie haben gar keine Programmierschnittstelle usw. Im Hintergrund wartet im Normalfalle immer ne Baufirma auf Pläne. Und dummerweise mit Terminen, die nicht von mir stammen. Deswegen sehe ich immer zu möglichst schnell zum Ziel zu gelangen. Da kann ich mir rumfummelei nicht erlauben und habe da auch keine besondere Lust zu.
Lieben Gruß
Thomas

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

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