Hot News aus dem CAD.de-Newsletter:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Inventor VBA
  Mit Abhängigkeiten kopieren

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
Autor Thema:   Mit Abhängigkeiten kopieren (993 mal gelesen)
KAME-WJ
Mitglied
Maschinenbau-Ingenieur


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

Beiträge: 14
Registriert: 22.09.2014

erstellt am: 30. Sep. 2016 15: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

Hallo Programmier-Gemeinde,

ich arbeite gerade an einem Macro welches ein(e) markierte(s) Bauteil/Baugruppe erneut in die Baugruppe einfügt und diese mit den selben Abhängigkeiten versieht. (Das neu eingefügte Bauteil/Baugruppe befindet sich somit am selben Platz wie das zuvor markierte und die selben Abhängigkeiten aufweist).

Nun bin ich aber schon eine Zeit lang am tüfteln wie ich dies realisieren könnte, da ich bis jetzt noch nicht herausgefunden habe, wie ich die in der Abhängigkeit referenzierte Fläche/Ebene/Punkt (genannt EntityOne/EntityTwo) des "alten" Bauteils/Baugruppe mit dem der kopierten ersetzen kann.

Ich bin soweit, dass das markierte Bauteil/Baugruppe in die Baugruppe neu eingefügt wird, und dann sollen eben noch die selben Abhängigkeiten wie bei der markierten vergeben werden.

Hintergedanke ist dabei, dass man bei unregelmäßig angeordnetetn Bauteilen/Baugruppen nur mehr den Wert der gewünschten Abhängigkeit ändern muss.

Weiß jemand ob es so etwas in der richtung schon gibt oder hat jemand eine Idee wie man das programmieren kann?

Code:

Public Sub CopyInOrigin()


    Dim oDoc As Document
    Set oDoc = ThisApplication.ActiveDocument
    Dim oSelectSet As SelectSet
    Set oSelectSet = oDoc.SelectSet

    If oDoc.DocumentType <> kAssemblyDocumentObject Then
        MsgBox "Dieses Makro funktioniert nur in einer Baugruppe!", vbCritical
        End
    End If

    If oSelectSet.Count = 0 Then
        MsgBox "Keine Komponenten ausgewählt", vbExclamation + vbOKOnly + vbMsgBoxSetForeground, "Achtung"
        Exit Sub
    End If

    Dim oItem As Variant
    Set oSelectSet = ThisApplication.ActiveDocument.SelectSet

    Dim oAsmCompDef As AssemblyComponentDefinition
    Set oAsmCompDef = ThisApplication.ActiveDocument.ComponentDefinition

    Dim oTG As TransientGeometry
    Set oTG = ThisApplication.TransientGeometry

    Dim oMatrix As Matrix
    Set oMatrix = oTG.CreateMatrix

    Dim FullDocName As String

    Dim oOcc As ComponentOccurrence

    For Each oItem In oSelectSet

        FullDocName = oItem.ReferencedDocumentDescriptor.FullDocumentName

        Set oOcc = oAsmCompDef.Occurrences.Add(FullDocName, oMatrix)

        Dim oEntity As Object
        Dim oConstraint As Variant

        For Each oConstraint In oItem.Constraints

            Dim oInsert As InsertConstraint
            Dim oEntityOne As Object
            Set oEntityOne = oConstraint.EntityOne
            Dim oEntityTwo As Object
            Set oEntityTwo = oConstraint.EntityTwo

            Select Case oConstraint.Type

                Case kAngleConstraintObject

'                    ...

                Case kFlushConstraintObject

                    Call oAssConstraints.AddFlushConstraint(oEntity, oEntityTwo, oConstraint.Offset.Expression)

                Case kInsertConstraintObject

'                  ....

                Case ksymentryconstraintobject

'                  ....

            End Select

'          ...hier sollte es dann iwie weitergehen ;)

        Next

    Next

End Sub


Also Leute, dann lasst uns mal Brainstormen 

Greets,
Joscha

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

KraBBy
Mitglied
Maschinenbau-Ingenieur


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

Beiträge: 233
Registriert: 19.09.2007

Inventor Professional 2016
Win7

erstellt am: 01. Aug. 2018 08: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 Nur für KAME-WJ 10 Unities + Antwort hilfreich

ACHTUNG! Sie antworten auf einen Beitrag der älter als 1 Jahr ist!


Hi Joscha,

gibts zu diesem Thema was neues? Bist Du zwischenzeitlich weiter gekommen?
Ein derartiges Makro hab ich mir auch schon eine Weile gewünscht / vorgenommen...

------------------
Gruß KraBBy

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

KAME-WJ
Mitglied
Maschinenbau-Ingenieur


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

Beiträge: 14
Registriert: 22.09.2014

erstellt am: 01. Aug. 2018 08:42    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

Dieses Makro habe ich mittlerweile schon total vergessen. 
Nein, bin leider nicht weiter gekommen.
Jetzt frage ich mich für was ich das Makro damals wohl benötigt habe...  

Grüße,
J

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

Tacker
Mitglied
TZ, Tech. MB, Softwareentwickler


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

Beiträge: 175
Registriert: 23.09.2010

IV 2017 Pro
i7-7700K 4x4.2GHz
32GB DDR4-2400
GTX 1060 6GB DDR5

erstellt am: 01. Aug. 2018 16:56    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 KAME-WJ 10 Unities + Antwort hilfreich

Moin 

Abhängigkeiten mit dem Makro erstellen ist relativ einfach.
Die Schwierigkeit ist eher die benötigten Geometrien dafür zu finden.
Bei meinen Baugruppenkonfiguratoren artet das ein bisschen aus. Hab in VB.NET ca 1200 Zeilen nur um Geometrien zu finden.
Wenn sicher ist, dass es die absolut identische Komponente ist, kann man nach dem Transientkey zur Identifikation gehen, das wäre hier wahrscheinlich der Fall.
Dann musst nur durch den entsprechenden Container (Edge, Face...) iterieren und deinen Transientkey wiederfinden, schon hast deine Geometrien und kannst die Abhängigkeit erstellen.
→ Achtung, Geometrien befinden sich immer im Bauteil, nicht in der Baugruppe

Sollte das nicht der Fall sein, dann wirds spaßiger. Dann musst nach Geometrischen Eigenschaften suchen und im Dümmsten Fall sogar abwägen was die richtige Geometrie ist. Deswegen ist das auch etwas umfangreich bei mir.

Gruß

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

KraBBy
Mitglied
Maschinenbau-Ingenieur


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

Beiträge: 233
Registriert: 19.09.2007

Inventor Professional 2016
Win7

erstellt am: 13. Aug. 2018 10:00    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 KAME-WJ 10 Unities + Antwort hilfreich

Jetzt stehe ich wohl auch vor dem Problem, die richtige Geometrie zu finden. Gut, dass Tacker schon alle derartigen Probleme gelöst hat 

Nun etwas ernsthafter. Ich versuche es zunächst textlich zu beschreiben (ohne Code, der vmtl. mehr verwirrt als hilft) anhand dieser beispielhaften Struktur:

Assy.iam
- UnterBgr.iam:1
-- T1.ipt:1
-- T1.ipt:2

Makro läuft in einer Baugruppe Assy.iam. Diese enthält eine Unterbaugruppe, in der sich zwei Instanzen des gleichen Bauteils befinden. Die UnterBgr. ist mit Abhängigkeiten versehen, die sie platzieren und ausrichten. Z.b. ein "Fluchtend1" zw. xy-Ebene von Assy.iam und der xy-Ebene von T1.ipt:1.

Ich möchte also die UnterBgr.iam nochmals in die Assy.iam einfügen (klappt) und die Abhängigkeit "Fluchtend2" erstellen, analog zu "Fluchtend1". Da sehe ich noch keinen Weg, um das richtige Element zu finden.

Ich habe die Abhängigkeit "Fluchtend1". Diese liefert mir die Properties .AffectedOccurrenceOne / .AffectedOccurrenceTwo und .EntityOne / .EntityTwo. Ich weiß auch, ob ich ...One oder ...Two ersetzen will. Die Entity wäre im Bsp. ein WorkPlaneProxy-Object, ua. mit der Eigenschaft .Nativeobject das die xy-Ebene der T1.ipt liefert.
Mein weiterer Ablauf (der für Einzelteile auch funktioniert) ist: von der Entity (Proxy-Object) über das .NativeObject wieder zu einem Proxy-Object zu kommen, jedoch von der neu eingefügten Occurence (oOccNeu.CreateGeometryProxy(...)). Das schlägt aber im Beispiel (eben bei Unterbaugruppen) fehl. Für mein Verständnis deshalb, weil IV nicht wissen kann, von welcher T1-Instanz die xy-Ebene gemeint ist. Liege ich damit schon mal richtig?

Ich bräuchte also noch die Information, zu welcher Instanz von T1 die Ebene gehört. Damit könnte ich ein Proxy-Object bezogen auf die UnterBgr. erzeugen und damit wiederum ein Proxy eine Ebene höher.
Oder gibt es direkt Zugriff auf das Proxy-Object in der UnterBgr.?

Das Vorgehen sollte dann natürlich auch für weiter verschachtelte Unterbaugruppen funktionieren.

------------------
Gruß KraBBy

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

KAME-WJ
Mitglied
Maschinenbau-Ingenieur


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

Beiträge: 14
Registriert: 22.09.2014

erstellt am: 12. Jun. 2019 12:51    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 KraBBy,

sry für die (sehr) verspätete Rückmeldung.
Bin leider echt kein Profi sondern mehr ein Trial and Error Programmierer 
Das übersteigt leider meine Kompetenzen. Vielleicht findet sich ja noch jemand der uns helfen kann.

Grüße,
J

------------------
"ENGINEER"

noun. [en-juh-neer]

Someone who does precision
guesswork based on unreliable
data provided by those of
questionable knowledge

See also wizard, magician

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

dg2405
Mitglied
Ingenieur MB


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

Beiträge: 30
Registriert: 16.06.2011

I7-4960X@4.7Ghz
Radeon R9-295X2
Samsung 840EVO
Win7-64bit SP1
IV2014 SP1

erstellt am: 28. Jul. 2019 13:48    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 KAME-WJ 10 Unities + Antwort hilfreich

So in der Art funktioniert es bei mir. Allerdings nicht wenn die Abhängigkeiten auf Ursprungsebenen gemacht werden. Aber als ersten Ansatz reicht dir das vlt. Manches ist evtl. umständlich gemacht, der Code ist schon ein paar Jahre alt... Wenn ich Zeit hab kann ich den Code überarbeiten und auch nach den Ursprungsebenen schauen. Beim Winkel ist mit dem Referenzvektor auch noch ein kleiner Fehler drin 

Sub Teile_identisch_einfuegen()

'Auf Bg zugreifen
Dim oApp As Inventor.Application
Set oApp = ThisApplication
Dim oAsmDoc As AssemblyDocument
Set oAsmDoc = oApp.ActiveDocument
Dim oAsmCompDef As AssemblyComponentDefinition
Set oAsmCompDef = oAsmDoc.ComponentDefinition

'Bg greifen
Dim oOcc As ComponentOccurrence
Set oOcc = ThisApplication.CommandManager.Pick(kAssemblyOccurrenceFilter, "Teile oder Baugruppe auswählen")
Dim oDoc As Document
Set oDoc = oOcc.Definition.Document

'Anzahl Teile eingeben
Anzahl_Teile = InputBox("Bitte Teileanzahl eingeben", "Eingabe", 1)

'Durchschleifen
For i = 1 To Anzahl_Teile
    Call oAsmDoc.SelectSet.Select(oOcc)
    oApp.CommandManager.ControlDefinitions.Item("AppCopyCmd").Execute
    oApp.CommandManager.ControlDefinitions.Item("AppPasteCmd").Execute
    NewOccName = oAsmCompDef.Occurrences(oAsmCompDef.Occurrences.Count).Name
    NewOccName = Left(oOcc.Name, InStrRev(oOcc.Name, ":")) & Right(NewOccName, Len(NewOccName) - InStrRev(NewOccName, ":"))
    oAsmCompDef.Occurrences(oAsmCompDef.Occurrences.Count).Name = NewOccName
   
    Dim oConstraint As AssemblyConstraint
    For Each oConstraint In oOcc.Constraints
        If oConstraint.Suppressed = False Then
            Dim oNode As BrowserNode
            Set oNode = Nothing
            Dim NewNodePath As String
            NewNodePath = ""
            Dim oNewOcc As ComponentOccurrence
            Set oNewOcc = Nothing
            Dim oNewObjectProxy As Object
            Set oNewObjectProxy = Nothing

            If oConstraint.AffectedOccurrenceTwo Is oOcc Then
                Set oNode = oAsmDoc.BrowserPanes.ActivePane.GetBrowserNodeFromObject(oConstraint.EntityTwo.ContainingOccurrence)
                n1 = Left(oNode.FullPath, InStr(oNode.FullPath, oOcc.Name) - 1)
                n2 = Right(oNode.FullPath, Len(oNode.FullPath) - InStr(oNode.FullPath, oOcc.Name) - Len(oOcc.Name) + 1)
                NewNodePath = n1 & NewOccName & n2
                Set oNode = GetBrowserNodeByFullPath(NewNodePath)
                Set oNewOcc = oNode.NativeObject
               
                Call oNewOcc.CreateGeometryProxy(oConstraint.EntityTwo.NativeObject, oNewObjectProxy)
                If oConstraint.Type = kInsertConstraintObject Then
                    Call oAsmCompDef.Constraints.AddInsertConstraint(oConstraint.EntityOne, oNewObjectProxy, oConstraint.AxesOpposed, oConstraint.Distance.Expression)
                End If
                If oConstraint.Type = kFlushConstraintObject Then
                    Call oAsmCompDef.Constraints.AddFlushConstraint(oConstraint.EntityOne, oNewObjectProxy, oConstraint.Offset.Expression)
                End If
                If oConstraint.Type = kMateConstraintObject Then
                    Call oAsmCompDef.Constraints.AddMateConstraint(oConstraint.EntityOne, oNewObjectProxy, oConstraint.Offset.Expression, oConstraint.EntityOneInferredType, oConstraint.EntityTwoInferredType)
                End If
                If oConstraint.Type = kAngleConstraintObject Then
                    Call oAsmCompDef.Constraints.AddAngleConstraint(oConstraint.EntityOne, oNewObjectProxy, oConstraint.Angle.Expression, oConstraint.SolutionType, oConstraint.ReferenceVectorEntity)
                End If
            End If
            If oConstraint.AffectedOccurrenceOne Is oOcc Then
                Set oNode = oAsmDoc.BrowserPanes.ActivePane.GetBrowserNodeFromObject(oConstraint.EntityOne.ContainingOccurrence)
                n1 = Left(oNode.FullPath, InStr(oNode.FullPath, oOcc.Name) - 1)
                n2 = Right(oNode.FullPath, Len(oNode.FullPath) - InStr(oNode.FullPath, oOcc.Name) - Len(oOcc.Name) + 1)
                NewNodePath = n1 & NewOccName & n2
                Set oNode = GetBrowserNodeByFullPath(NewNodePath)
                Set oNewOcc = oNode.NativeObject
           
                Call oNewOcc.CreateGeometryProxy(oConstraint.EntityOne.NativeObject, oNewObjectProxy)
                If oConstraint.Type = kInsertConstraintObject Then
                    Call oAsmCompDef.Constraints.AddInsertConstraint(oNewObjectProxy, oConstraint.EntityTwo, oConstraint.AxesOpposed, oConstraint.Distance.Expression)
                End If
                If oConstraint.Type = kFlushConstraintObject Then
                    Call oAsmCompDef.Constraints.AddFlushConstraint(oNewObjectProxy, oConstraint.EntityTwo, oConstraint.Offset.Expression)
                End If
                If oConstraint.Type = kMateConstraintObject Then
                    Call oAsmCompDef.Constraints.AddMateConstraint(oNewObjectProxy, oConstraint.EntityTwo, oConstraint.Offset.Expression, oConstraint.EntityOneInferredType, oConstraint.EntityTwoInferredType)
                End If
                If oConstraint.Type = kAngleConstraintObject Then
                    Call oAsmCompDef.Constraints.AddAngleConstraint(oNewObjectProxy, oConstraint.EntityTwo, oConstraint.Angle.Expression, oConstraint.SolutionType, oConstraint.ReferenceVectorEntity)
                End If
            End If
        End If
    Next
Next
End
End Sub
'Get the Main BrowserPane for any type of document
Public Function GetDocumentBrowserPane(oDoc As Document) As BrowserPane
    Dim oModelBP As BrowserPane
    'Get the Model BrowserPane for Part
    If (TypeOf oDoc Is PartDocument) Then
        Set oModelBP = oDoc.BrowserPanes.Item("PmDefault")
    End If
    'Get the Model BrowserPane for Assembly
    If (TypeOf oDoc Is AssemblyDocument) Then
        Set oModelBP = oDoc.BrowserPanes.Item("AmBrowserArrangement")
    End If
    'Get the Model BrowserPane for Drawing
    If (TypeOf oDoc Is DrawingDocument) Then
        Set oModelBP = oDoc.BrowserPanes.Item("DlHierarchy")
    End If
    Set GetDocumentBrowserPane = oModelBP
End Function
Public Function GetBrowserNodeByFullPathRecursive(oBrowserNode As BrowserNode, FullPath As String) As BrowserNode
    If (oBrowserNode.FullPath = FullPath) Then
        Set GetBrowserNodeByFullPathRecursive = oBrowserNode
        Exit Function
    End If
    Dim oBrowserNodeIterator As BrowserNode
    For Each oBrowserNodeIterator In oBrowserNode.BrowserNodes
        Dim oResultNode As BrowserNode
        Set oResultNode = GetBrowserNodeByFullPathRecursive(oBrowserNodeIterator, FullPath)
        If Not oResultNode Is Nothing Then
            Set GetBrowserNodeByFullPathRecursive = oResultNode
            Exit Function
        End If
    Next
End Function
Public Function GetBrowserNodeByFullPath(FullPath As String) As BrowserNode
    Dim oModelBP As BrowserPane
    Set oModelBP = GetDocumentBrowserPane(ThisApplication.ActiveDocument)
    Set GetBrowserNodeByFullPath = GetBrowserNodeByFullPathRecursive(oModelBP.TopNode, FullPath)
End Function

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

KraBBy
Mitglied
Maschinenbau-Ingenieur


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

Beiträge: 233
Registriert: 19.09.2007

Inventor Professional 2016
Win7

erstellt am: 05. Aug. 2019 13: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 Nur für KAME-WJ 10 Unities + Antwort hilfreich

Hi dg2405,

hatte jetzt Gelegenheit mich mit Deinem Code etwas zu beschäftigen. Läuft durch und löst meinen Problemfall mit der Unterbaugruppe. Vielen Dank dafür! Mit Abhängigkeiten auf Ursprungsebenen hatte ich in meinem kleinen Test übrigens keine Probleme. Kannst Du das noch etwas genauer Beschreiben, in welchen Fällen es Probleme gibt?

------------------
Gruß KraBBy

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)2019 CAD.de | Impressum | Datenschutz