AnsweredAssumed Answered

Apply Material (Delegate)

Question asked by Michael Corriveau-Cote on Oct 17, 2018
Latest reply on Feb 12, 2019 by Michael Corriveau-Cote

Hi,

 

I've been reading alot about the avalaible delegates with SldWorks :

2017 SOLIDWORKS API Help - SolidWorks.Interop.sldworks Namespace

 

I can't seem to find a way for my addin to know when a material is applied to the part. For now, i am using the SaveFileNotify but it really isn't optimal.

 

Anyone has an idea?

 

 

Here's the my code to transfert Material Custom Properties to the Configuration Specific Custom Properties. Starting Function is TransfererProprietePersonalisee_Material :

 

    ''' <summary>
    ''' 
    ''' </summary>
    Private Class Classification
        Public Property Name As String = ""
        Public Property Materials As New List(Of Material)


        Public Sub New()
        End Sub


        Public Sub New(_Name As String)
            Name = _Name
        End Sub
    End Class


    ''' <summary>
    ''' 
    ''' </summary>
    Private Class Material
        Public Property Name As String = ""
        Public Property CustomProperties As New List(Of CustomProperty)
        Public Sub New()
        End Sub


        Public Sub New(_Name As String)
            Name = _Name
        End Sub
    End Class


    ''' <summary>
    ''' 
    ''' </summary>
    Private Class CustomProperty
        Public Property Name As String
        Public Property Value As String


        Public Sub New()


        End Sub
        Public Sub New(_NomPropriete As String)
            Name = _NomPropriete
        End Sub


        Public Sub New(_NomPropriete As String, _Valeur As String)
            Name = _NomPropriete
            Value = _Valeur
        End Sub
    End Class


    ''' <summary>
    ''' Transfert les proprietes personalisees du materaux choisi vers file->properties->custom
    ''' </summary>
    Public Sub TransfererProprietePersonalisee_Material(swApp As sldworks.SldWorks)
        'ugogo




        Dim ListClassifications As List(Of Classification) = ParseXMLCustomMaterial()
        Dim swDoc As sldworks.ModelDoc2 = swApp.ActiveDoc
        Dim swPartDoc As sldworks.PartDoc = swDoc
        'Dim OriginalConfig As String = swDoc.ConfigurationManager.ActiveConfiguration.Name


        For Each Configuration As String In swDoc.GetConfigurationNames
            Dim MaterialDbInfo As String = ""
            Dim Material As String = swPartDoc.GetMaterialPropertyName2(Configuration, MaterialDbInfo)


            DeleteMaterialCustomProperties(swDoc, Configuration, ListClassifications)


            For Each prop As CustomProperty In AddMaterialPropertiesToCustom(Material, ListClassifications)
                swDoc.AddCustomInfo3(Configuration, prop.Name.ToString, swCustomInfoType_e.swCustomInfoText, prop.Value.ToString)
            Next


        Next


        'swDoc.ShowConfiguration2(OriginalConfig)


    End Sub


    Private Function GetMaterial(swDoc As sldworks.ModelDoc2) As String


        Dim SwFeat As sldworks.Feature = swDoc.FirstFeature()
        'Fait le tour du feature tree (gauche) pour trouver le matériau sélectionner
        Do While Not SwFeat Is Nothing
            If SwFeat.GetTypeName2.ToUpper = "MATERIALFOLDER" Then
                Return SwFeat.Name
            End If
            SwFeat = SwFeat.GetNextFeature
        Loop


    End Function




    Private Function AddMaterialPropertiesToCustom(Material As String, ListClassifications As List(Of Classification)) As List(Of CustomProperty)
        Dim ReturnList As New List(Of CustomProperty)
        For Each Classif As Classification In ListClassifications
            For Each Mat As Material In Classif.Materials.Where(Function(x) x.Name = Material)
                ReturnList.AddRange(Mat.CustomProperties)
            Next
        Next


        Return ReturnList
    End Function
    ''' <summary>
    ''' 
    ''' </summary>
    Private Function DeleteMaterialCustomProperties(swDoc As sldworks.ModelDoc2, Configuration As String, ListClassifications As List(Of Classification)) As List(Of CustomProperty)


        Dim ReturnList As New List(Of CustomProperty)
        Dim PropertyNames As String() = swDoc.GetCustomInfoNames2(Configuration)




            For i As Integer = 0 To PropertyNames.Count - 1
            If IsMaterialCustomProp(PropertyNames(i), ListClassifications) Then
                swDoc.DeleteCustomInfo2(Configuration, PropertyNames(i))
            Else
                    'Faire une liste de ce qui est déjà traité?


                End If
            'Else
            '    'ReturnList.Add(New CustomProperty(PropertyNames(i), swDoc.GetCustomInfoValue(Configuration, PropertyNames(i))))
            '    ReturnList.Add(New CustomProperty(PropertyNames(i)))
            'End If


        Next


        Return ReturnList


    End Function




    Private Function IsMaterialCustomProp(PropertyName As String, ListClassifications As List(Of Classification)) As Boolean
        For Each Classif As Classification In ListClassifications
            For Each Mat As Material In Classif.Materials
                If Mat.CustomProperties.Where(Function(x) x.Name = PropertyName).Count Then Return True
            Next
        Next
        Return False
    End Function




    ''' <summary>
    ''' '''Va chercher toute les propriete custom des materiaux custom dans la librairie du poste et sur le réseau
    ''' </summary>
    ''' <returns></returns>
    Private Function ParseXMLCustomMaterial() As List(Of Classification)


        'check for ING library of custom mats
        Dim ReturnList As New List(Of Classification)
        Dim PathCustomMatING As String = MyConfig.ConfigApplications.PathCustomMatING
        Dim fichierArray() As String = Directory.GetFiles(PathCustomMatING)
        Dim PathXML As New List(Of String)


        If fichierArray.Count = 0 Then
            MsgBox("Impossible d'accèder au répertoire de matériaux : " + vbCr + PathCustomMatING)
        End If


        For Each fichier As String In fichierArray
            If Path.GetExtension(fichier) = ".sldmat" Then PathXML.Add(fichier)
        Next


        'check for local custommatfile xml (tries french then english)
        If File.Exists(MyConfig.ConfigApplications.PathCustomsldmatlocalfrench) Then
            PathXML.Add(MyConfig.ConfigApplications.PathCustomsldmatlocalfrench)
        Else
            If File.Exists(MyConfig.ConfigApplications.PathCustomsldmatlocalenglish) Then
                PathXML.Add(MyConfig.ConfigApplications.PathCustomsldmatlocalenglish)
            Else
                MsgBox("Le Fichier de matériaux personnalisés local est introuvable sur ce poste")
                'Exit Sub
            End If
        End If


        If PathXML.Count = 0 Then
            MsgBox("Aucune librairie de matériaux personnalisés n'a pu être trouvée")
            Exit Function
        End If


        For Each fichier As String In PathXML
            ReturnList.AddRange(ParseXMLTraitement(fichier))
        Next


        Return ReturnList
    End Function


    ''' <summary>
    ''' Lit chacun des fichier XML trouvés pour extraire les proprietes personnalisées
    ''' </summary>
    ''' <param name="PathXML"></param>
    Private Function ParseXMLTraitement(PathXML As String) As List(Of Classification)


        Dim ReturnList As New List(Of Classification)
        Dim Configuration As New System.Xml.XmlDocument
        Configuration.Load(New System.IO.StreamReader(PathXML))


        Dim ClassificationNode As System.Xml.XmlNode = Configuration.FirstChild.NextSibling.FirstChild.NextSibling




        While Not ClassificationNode Is Nothing
            Dim newClassification As New Classification(ClassificationNode.Attributes("name").Value)
            Dim MaterialNode As System.Xml.XmlNode = ClassificationNode.FirstChild


            While Not MaterialNode Is Nothing
                Dim newMaterial As New Material(MaterialNode.Attributes("name").Value)
                Dim CustomNode As System.Xml.XmlNode = MaterialNode.SelectSingleNode("custom")
                While Not CustomNode Is Nothing
                    Dim PropNode As System.Xml.XmlNode = CustomNode.FirstChild


                    While Not PropNode Is Nothing
                        newMaterial.CustomProperties.Add(New CustomProperty(PropNode.Attributes("name").Value, PropNode.Attributes("value").Value))
                        PropNode = PropNode.NextSibling
                    End While


                    CustomNode = CustomNode.NextSibling
                End While
                newClassification.Materials.Add(newMaterial)
                MaterialNode = MaterialNode.NextSibling
            End While
            ReturnList.Add(newClassification)
            ClassificationNode = ClassificationNode.NextSibling
        End While


        Return ReturnList


    End Function

 

 

Thanks

 

Ce message a été modifié par : Michael Corriveau-Cote

 

Ce message a été modifié par : Michael Corriveau-Cote

Outcomes