Communauté
Inventor - Français
Bienvenue sur les forums Inventor d’Autodesk. Partagez vos connaissances, posez des questions, collaborez sur des idées, et explorez les sujets Inventor populaires.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

Inventor : Régle Ilogic pour export DXF depuis un assemblage

34 RÉPONSES 34
RÉSOLU
Répondre
Message 1 sur 35
thibault.franchini
811 Visites, 34 Réponses

Inventor : Régle Ilogic pour export DXF depuis un assemblage

Bonjour,

 

Je suis en train de me familiariser avec le codage pour les règles iLogic. Mon but est de faire une règle qui génère les dxf des pièces de tôlerie depuis un assemblage.

 

Je suis déjà parvenu à faire un code qui me permet :

 

- D'exporter un dxf depuis un ipt

- Utiliser une configuration spécifique d'export

- Enregistrer le dxf dans le dossier de la pièce

- Ajouter la nuance et l'épaisseur en plus du nom de la pièce lors de l’enregistrement

 

Pour les amateurs, le code actuel est en PJ.

 

Désormais je voudrais passer à l'étape supérieure en faisant tourner cette règle depuis un assemblage, mais je ne sais pas de tout pas où commencer...

 

Ensuite au niveau des règles, est-il préférable de faire une règle qui renvoi à la règle actuelle pour chaque pièce de tôlerie ou au contraire de d'intégrer tout dans la même règle ?

 

Si vous avez des pistes pour me mettre le pied à l'étrier, je suis preneur !


Le titre du sujet a été modifié par un modérateur pour faciliter la recherche. Titre original:
Régle Ilogic pour export DXF depuis un assemblage

34 RÉPONSES 34
Message 2 sur 35
vpeuvion
en réponse à: thibault.franchini

Bonjour,

Vous allez devoir lister les occurrences de l'assemblage et ensuite pour chacune d'entre elles effectuer les opérations que vous faites pour une pièce.

Voici un exemple pour afficher le nom de chaque occurrence d'un assemblage :

Dim oAsmDocument As AssemblyDocument = ThisDoc.Document
Dim oAsmCompDef As AssemblyComponentDefinition = oAsmDocument.ComponentDefinition
Dim oLeafOccs As ComponentOccurrencesEnumerator = oAsmCompDef.Occurrences.AllLeafOccurrences
For Each oOccurrence As ComponentOccurrence In oLeafOccs
	MessageBox.Show(oOccurrence.Name)
Next

Ensuite lorsque vous avez obtenu l'occurrence et que vous voulez accéder à la pièce correspondante, voici un autre exemple :

Dim oAsmDocument As AssemblyDocument = ThisDoc.Document
Dim oAsmCompDef As AssemblyComponentDefinition = oAsmDocument.ComponentDefinition
Dim oLeafOccs As ComponentOccurrencesEnumerator = oAsmCompDef.Occurrences.AllLeafOccurrences
For Each oOccurrence As ComponentOccurrence In oLeafOccs
	Dim oDoc As PartDocument = oOccurrence.Definition.Document
	MessageBox.Show(oDoc.DisplayName)
Next

Une fois que vous avez obtenu le document, les opérations restent les mêmes que pour une pièce comme dans votre code.

Pour ce qui est de la règle, vous pouvez intégrer le code dans une seule règle et au tout début tester si le document est une pièce ou un assemblage et en fonction du résultat exécuter une partie du code.

Voici un exemple : 

Sub Main()
	If ThisDoc.Document.DocumentType = DocumentTypeEnum.kAssemblyDocumentObject Then
       ExportDebitsAssemblage()
    ElseIf ThisDoc.Document.DocumentType = DocumentTypeEnum.kPartDocumentObject Then
       ExportDebitPiece()
    Else
		MessageBox.Show("Non applicable dans ce type de document")
		Exit Sub
	End If
End Sub

Sub ExportDebitsAssemblage()
	MessageBox.Show("Le document est détecté comme assemblage")
	
	'Votre code pour les assemblages ici
End Sub

Sub ExportDebitPiece()
	MessageBox.Show("Le document est détecté comme pièce")
	' Votre code pour les pièces ici
End Sub

J'espère vous avoir aidé.

Vincent.

 

Message 3 sur 35
lah29-bertrand
en réponse à: vpeuvion

Salut,

la regle ci dessous extrait les dxf depuis un assemblage avec :

_creation d'un dossier ds le chemin de l'assemblage

dxf au nom des pieces

-matiere

-epaisseur des tole

format des mises  a plat

 

cf copie ecran

@+

Capture d'écran 2023-11-28 093916.png

Assemblage

 

Capture d'écran 2023-11-28 093722.png

Creation du dossier dxf ds le rep de l'assemblage

 

Capture d'écran 2023-11-28 093754.png

generation du nomdxf: nomfichier/matiere/epaisseur/encombrement

'###  Ligne ci dessous ecrire ds l'entete ###
'Imports System.Threading.Tasks

Sub Main()
	
 'controle que le document actif est bien un assemblage
If ThisApplication.ActiveDocument.DocumentType <> kAssemblyDocumentObject Then
	MessageBox.Show("cette règle fonctionne uniquement avec un ensemble", "iLogic")
	Return
End If
'definition du document actif comme assemblage
Dim oAsmDoc As AssemblyDocument = ThisApplication.ActiveDocument
Dim oAsmName As String = Left(oAsmDoc.DisplayName, Len(oAsmDoc.DisplayName) -4)
Dim File As String = ThisDoc.FileName(False)
Dim oDoc As String
oDoc = ThisDoc.PathAndFileName(False)
'MessageBox.Show(oDoc, "Title")


'Affichage temporisé du message 
'Dim timeout = .7 ' seconds
'Dim form As New Form() With { .Enabled = False }
'Task.Delay(TimeSpan.FromSeconds(timeout)).ContinueWith(Sub(t)
'form.Close()
'End Sub ,
'TaskScheduler.FromCurrentSynchronizationContext())
'MessageBox.Show(form, String.Format("Génération des DXF pour les pieces de toleries de l'assemblage", timeout), "iLogic")

'Validation utilisateur
'RUsure = MessageBox.Show ( _
'"Génération des DXF pour les pieces de toleries de l'assemblage" _
'& vbLf & " " _
'& vbLf & "Sauvegarder avant execution", "                      iLogic - Génération DXF ",MessageBoxButtons.YesNo)
'If RUsure = vbNo Then
'Return
'End If

oPath = ThisDoc.Path
oDataMedium = ThisApplication.TransientObjects.CreateDataMedium
oContext = ThisApplication.TransientObjects.CreateTranslationContext
oContext.Type = IOMechanismEnum.kFileBrowseIOMechanism
oOptions = ThisApplication.TransientObjects.CreateNameValueMap

'verification et/ou création du repertoire DXF correspondant à l'assemblage
Dim Ofolder as String
oFolder = oPath & "\" & File & "_SortiesDXF du " & DateTime.Now.ToString("dd-MM-yy")
'MessageBox.Show(oFolder, "Title")

Process.Start("explorer.exe", oFolder)
If Not System.IO.Directory.Exists(oFolder) Then
	System.IO.Directory.CreateDirectory(oFolder)
End If

'Effacement des anciennes mise à plat en DXF
For Each foundFile As String In My.Computer.FileSystem.GetFiles(oFolder,
	Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, File & "*.dxf")
	My.Computer.FileSystem.DeleteFile(foundFile)
Next


'referencement des pieces de tolerie dans l'assemblage et controle de leur sauvegarde
Dim oRefDocs As DocumentsEnumerator = oAsmDoc.AllReferencedDocuments
Dim oRefDoc As Document
For Each oRefDoc In oRefDocs
	If oRefDoc.DocumentSubType.DocumentSubTypeID = "{9C464203-9BAE-11D3-8BAD-0060B0CE6BB4}" Then
		iptPathName = oRefDoc.FullDocumentName
'MessageBox.Show(iptPathName, "Title")

		'verification de la sauvegarde des pieces de l'assemblage
		If (System.IO.File.Exists(iptPathName)) Then
			Dim oPartDoc As PartDocument = ThisApplication.Documents.Open(iptPathName, True)
			Dim oFileNameWithoutExt As String = Left(oRefDoc.DisplayName, Len(oRefDoc.DisplayName) -4)
			Dim oFileName2 As String = Right(iptPathName, Len(iptPathName) - InStrRev(iptPathName, "\"))
			'MessageBox.Show(oFileNameWithoutExt, "Title")
			'MessageBox.Show(oFileName2, "Title2")
			Dim Name As String = oRefDoc.DisplayName
'MessageBox.Show(Name, "Title")

			Try
				'controle des mises a plat dans les pieces de l'assemblage
				Dim oCompDef As SheetMetalComponentDefinition = oPartDoc.ComponentDefinition
				Dim oFlatPattern As FlatPattern = oCompDef.FlatPattern

				If oCompDef.HasFlatPattern = False Then
					oCompDef.Unfold
					oPartDoc.Save
				End If
				'Else
				'If oCompDef.HasFlatPattern Then
				oCompDef.FlatPattern.Edit

				'End If
				ThisApplication.CommandManager.ControlDefinitions.Item("AppZoomallCmd").Execute

				Dim sOut As String
				sOut = "FLAT PATTERN DXF?AcadVersion=2007&OuterProfileLayer=IV_INTERIOR_PROFILES&InvisibleLayers=IV_TANGENT;IV_BEND;IV_BEND_DOWN;IV_TOOL_CENTER;IV_TOOL_CENTER__DOWN;IV_ARC_CENTERS;IV_OUTER_PROFILE;IV_FEATURE_PROFILES;IV_FEATURE_PROFILES_DOWN;IV_ALTREP_FRONT;IV_ALTREP_BACK;IV_UNCONSUMED_SKETCHES;IV_ROLL;IV_ROLL_TANGENT"
				'sOut = "FLAT PATTERN DXF?AcadVersion=2000&OuterProfileLayer=IV_INTERIOR_PROFILES&InvisibleLayers=IV_BEND_DOWN;IV_TANGENT;IV_BEND_UP;IV_BEND"
				'sOut = "FLAT PATTERN DXF?AcadVersion=2000&OuterProfileLayer=IV_INTERIOR_PROFILES;IV_BEND_DOWN;IV_TANGENT;IV_BEND_UP;IV_BEND"

				'sOut = "FLAT PATTERN DXF?AcadVersion=2000&OuterProfileLayer=IV_INTERIOR_PROFILES;IV_BEND;IV_BEND_UP;IV_BEND_DOWN&InvisibleLayers=IV_TANGENT&BendLayerLineTypeEnum=37641&BendLayerColor=255;164;0" 
				'+ "&OuterProfileLayer=IV_INTERIOR_PROFILES" _
				'+ "&InvisibleLayers=IV_BEND_DOWN" _
				'+ "&InvisibleLayers=IV_TANGENT" _
				'+ "&InvisibleLayers=IV_BEND_UP" _
				'+ "&InvisibleLayers=IV_BEND" _
				'+ "&SimplifySplines=True" _
				'+ "&BendLayerLineType=37634" _
				'+ "&BendLayerColor=255;255;0" _
				'+ "&BendUpLayerLineType=37634" _
				'+ "&BendUpLayerColor=255;255;0" _
				'+ "&BendDownLayerLineType=37634" _
				'+ "&BendDownLayerColor=255;255;0" _
				'+ "&FeatureProfilesLayerLineType=37634" _
				'+ "&FeatureProfilesLayerColor=255;255;0" _
				'+ "&FeatureProfilesUpLayerLineType=37634" _
				'+ "&FeatureProfilesUpLayerColor=255;255;0" _
				'+ "&FeatureProfilesDownLayerLineType=37634" _
				'+ "&FeatureProfilesDownLayerColor=255;255;0"

				'Creation du nom de fichier DXF
				Dim SubPartlength As Double = Round(oFlatPattern.Length, 3) * 10
				'MessageBox.Show(SubPartlength, "Title")
				Dim SubPartwidth As Double = Round(oFlatPattern.Width, 3) * 10
				'MessageBox.Show(SubPartwidth, "Title")
				Dim SubPartEpais As Double = Parameter(Name, "Epaisseur")
				'MessageBox.Show(SubPartEpais, "Title")
				Dim SubPartMat As String = iProperties.Material(Name)
				'MessageBox.Show(SubPartMat, "Title")
				sFN = oFileNameWithoutExt '& "_" & SubPartMat & "_Ep" & SubPartEpais & "_" & SubPartlength & "x" & SubPartwidth & "mm.dxf"
				'MessageBox.Show(sFN, "Title")

				oDataMedium.FileName = Ofolder & "\" & Name & "_" & SubPartMat & "_Ep" & SubPartEpais & "_" & SubPartlength & "x" & SubPartwidth & "mm.dxf"
				'oDataMedium.FileName = Ofolder & "\" & oFileNameWithoutExt & "_" & SubPartMat & "_Ep" & SubPartEpais & "_" & SubPartlength & "x" & SubPartwidth & "mm.dxf"
				iProperties.Value(Name, "Custom", "DXF") = sFN
				iProperties.Value(Name, "Custom", "Encombrement") = SubPartlength &"x"& SubPartwidth &"_Ep "& SubPartEpais
				oCompDef.DataIO.WriteDataToFile(sOut, oDataMedium.FileName)
				'just for check its works coretcly
				'i=MessageBox.Show(oDataMedium.FileName, "Title",MessageBoxButtons.OKCancel)
				'MessageBox.Show(i,"title",MessageBoxButtons.OK)
				'If i=2 Then
				'Exit Sub
				'End If
				'oCompDef.FlatPattern.ExitEdit

				'End If

			Catch
			End Try
			
			
			'iProperties.Value("Custom", "Larg") = Round(SheetMetal.FlatExtentsWidth, 2)
			'iProperties.Value("Custom", "Long") = Round(SheetMetal.FlatExtentsLength, 2)
			'iProperties.Value("Custom", "Surf") = Round(SheetMetal.FlatExtentsArea * 0.000001, 3)
			oPartDoc.Close
			'Else
		End If
	End If
Next
'ThisDoc.Launch(oDataMedium.FileName)
End Sub

 

Message 4 sur 35
lah29-bertrand
en réponse à: lah29-bertrand

bon euh je viens de m'apercevoir qu'il y a pas mal de lignes de test que tu peux supprimer ds le code 😉
Message 5 sur 35

Bonjour,

 

Merci beaucoup pour vos réponses !  Je vois que certains ont déjà bossé le sujet.

 

Avec ça, j'ai déjà une base de travail. Je vais essayer de le personnaliser à nos besoins et surtout essayer de le comprendre pour ne pas faire un simple copier/coller.

 

Je me mets dessus et je vous donne des nouvelles dès je suis arrivé à quelque chose de concluant ou si je bute.

 

Bonne journée.

 

 

Message 6 sur 35
ThomasB44
en réponse à: thibault.franchini

Salut @thibault.franchini 

Les fonctions ou les procédures seront d'une grande aide pour concevoir des codes plus complexes.

  1. Ton code sera facilement lisible pour quelqu'un qui ne l'a pas écrit
  2. Tu pourras réutiliser les briques de fonctions ou de procédures que tu vas concevoir pour d'autres codes
  3. Une fonction ou une procédure peut retourner un résultat
  4. La gestion des exceptions est plus facile

Par exemple, la fonction OccName ci-dessous reprend l'argument oApp qui est dans le code principal, l'utilise, et retourne une valeur de type String, qui est finalement lue dans une boite de message du code principal.

 

 

Sub Main()
Dim oApp As Inventor.Application = ThisApplication

MsgBox( "You have selected : " & OccName(oApp) )

End Sub

Function OccName(ByRef oApp As Inventor.Application) As String
	Dim oOcc As ComponentOccurrence
	oOcc = oApp.CommandManager.Pick( _
	SelectionFilterEnum.kAssemblyLeafOccurrenceFilter, "Select a component :")
	If oOcc IsNot Nothing Then 
		Return oOcc.Name
	Else 
		Return "Nothing"
	End If
End Function

 

 

Les fonctions et procédures seront donc très utiles pour par exemple boucler à travers un assemblage, trouver une pièce, puis regarder à l'aide d'une fonction si un dessin de cette pièce existe, l'ouvrir et l'exporter en PDF à l'aide d'une autre fonction.


Thomas
Mechanical Designer / Inventor Professionnal 2023
Inventor Professional EESignature

Message 7 sur 35

Bonjour,

 

Je suis parvenu avec quelques difficultés à avoir une règle qui fonctionnelle en mixant ma règle d'export DXF et la règle proposée par @lah29-bertrand.

 

Par contre je n'arrive pas à ajouter la matière et l'épaisseur au nom du fichier. J'ai ajouté des messages box dans le code afin de m'en servir comme checkpoint, et si je demande par exemple la matière, les enregistrements de DXF de ne font pas ...

 

Voilà la fin de mon code :

 

	' Déclaration des variables

Dim sOut As String
Dim sMat As String
Dim Epaisseur As String

MessageBox.Show ("Variables OK")

    'sMAt = iProperties.Material(Name)
    'sEp = iProperties.Value("Custom", "Epaisseur")
    sOut = "FLAT PATTERN DXF?AcadVersion=2004&OuterProfileLayer=IV_INTERIOR_PROFILES"

MessageBox.Show ("mat ép")

Dim oFileName, oDxfName As String
oFileName = Name
If oFileName Is Nothing Then
MessageBox.Show ("Enregistrer le document d'abord", "iLogic")
Return

oDxfName = Left(oFileName,Len(OFileName)-3) & "dxf"

Else
oCompDef.FlatPattern.Edit
End If



	 ' Création nom du fichier

'sFN = oFileNameWithoutExt '& "_" & sMat & "_Ep" & Epaisseur & .dxf"

oDataMedium.FileName = Ofolder & "\" & oFileName & "_" & sMat & "_" & Epaisseur & "mm.dxf"
	
	'oPath = ThisDoc.Path

    'Dim sFname As String
	'sFname = oPath & "\" & ThisDoc.FileName(False) & "-" & sMat & "-" & sEp & ".dxf"
    MessageBox.Show("DXF SAVED TO: " & sFname ,"DXF Saved", MessageBoxButtons.OK)

    'oCompDef.DataIO.WriteDataToFile( sOut, sFname)

    Dim oSMDef As SheetMetalComponentDefinition

    'oSMDef = oDoc.ComponentDefinition
    'oSMDef.FlatPattern.ExitEdit

oCompDef.DataIO.WriteDataToFile(sOut, oDataMedium.FileName)



Catch
End Try
End If

Next

End Sub

 

 

J'ai encore un peu de ménage à faire dedans, mais en lisant ma règle est-ce quelqu'un à une idée pour mon soucis de matière/épaisseur ?

Message 8 sur 35
vpeuvion
en réponse à: thibault.franchini

Bonjour,

Vous déclarez Dim Epaisseur As String, mais Epaisseur est un paramètre numérique par défaut d'Inventor. Il doit s'afficher en violet et vous ne pouvez pas l'utiliser de cette façon. Si vous voulez l'utiliser, il faut le renommer.

Il est difficile de tester votre code tel quel puisqu'il y en a qu'une partie, beaucoup de lignes sont commentées, il faut faire un peu de ménage comme vous écrivez et ce sera plus clair pour vous aussi.

Voici un exemple de code qui peut peut-être vous aider à y voir plus clair.

	Dim Ofolder As String = "C:\MyFolder"
	MessageBox.Show("Nom du dossier: " & Ofolder)
	
	Dim oFilename As String = Left(ThisDoc.Document.DisplayName,Len(ThisDoc.Document.DisplayName)-4)
	MessageBox.Show("Nom du fichier: " & oFilename)
	
	Dim sMat As String
	sMat = iProperties.Material(Name)
	MessageBox.Show("Matière : " & sMat)
	
	MessageBox.Show("Epaisseur : " & Epaisseur)

	Dim oDXFFullfileName As String = Ofolder & "\" & oFilename & "_" & sMat & "_" & Epaisseur & "mm.dxf"
	MessageBox.Show("Dxf Full file name : " & oDXFFullfileName)

  Vincent.

Message 9 sur 35
thibault.franchini
en réponse à: vpeuvion

Quelque chose m'échappe car je ré-utilise la structure du code que j'utilise dans ma règle d'export DXF depuis une pièce.

 

Et ça fonctionne.

 

Dim sOut As String

	Dim sMat As String
	Dim Epaisseur As String
	Dim oPath As String

	sMAt = iProperties.Material
	sEp = iProperties.Value("Custom", "Epaisseur")
    sOut = "FLAT PATTERN DXF?AcadVersion=2004&OuterProfileLayer=IV_INTERIOR_PROFILES"
	
	oPath = ThisDoc.Path

 

Pour la lisibilité, il est important je faire du tri, je suis d'accord.

 

Je vais essayer votre approche pour les matières/épaisseurs

 

Message 10 sur 35

tiens, j'ai fait un peu de tri ds ma regle + ajout de commentaire

@+

 

Sub Main()
	
 'controle que le document actif est bien un assemblage
If ThisApplication.ActiveDocument.DocumentType <> kAssemblyDocumentObject Then
	MessageBox.Show("cette règle fonctionne uniquement avec un ensemble", "iLogic")
	Return
End If
'definition du document actif comme assemblage
Dim oAsmDoc As AssemblyDocument = ThisApplication.ActiveDocument
Dim oAsmName As String = Left(oAsmDoc.DisplayName, Len(oAsmDoc.DisplayName) -4)
Dim File As String = ThisDoc.FileName(False)
Dim oDoc As String
oDoc = ThisDoc.PathAndFileName(False)

oPath = ThisDoc.Path
oDataMedium = ThisApplication.TransientObjects.CreateDataMedium
oContext = ThisApplication.TransientObjects.CreateTranslationContext
oContext.Type = IOMechanismEnum.kFileBrowseIOMechanism
oOptions = ThisApplication.TransientObjects.CreateNameValueMap

'verification et/ou création du repertoire DXF correspondant à l'assemblage
Dim Ofolder As String
Ofolder = oPath & "\" & File & "_SortiesDXF du " & DateTime.Now.ToString("dd-MM-yy")
'MessageBox.Show(oFolder, "Title")

Process.Start("explorer.exe", Ofolder)
If Not System.IO.Directory.Exists(Ofolder) Then
	System.IO.Directory.CreateDirectory(Ofolder)
End If

'Effacement des anciennes mise à plat en DXF
For Each foundFile As String In My.Computer.FileSystem.GetFiles(Ofolder,
	Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, File & "*.dxf")
	My.Computer.FileSystem.DeleteFile(foundFile)
Next


'referencement des pieces de tolerie dans l'assemblage et controle de leur sauvegarde
Dim oRefDocs As DocumentsEnumerator = oAsmDoc.AllReferencedDocuments
Dim oRefDoc As Document
For Each oRefDoc In oRefDocs
	If oRefDoc.DocumentSubType.DocumentSubTypeID = "{9C464203-9BAE-11D3-8BAD-0060B0CE6BB4}" Then
		iptPathName = oRefDoc.FullDocumentName


		'verification de la sauvegarde des pieces de l'assemblage
		If (System.IO.File.Exists(iptPathName)) Then
			Dim oPartDoc As PartDocument = ThisApplication.Documents.Open(iptPathName, True)
			Dim oFileNameWithoutExt As String = Left(oRefDoc.DisplayName, Len(oRefDoc.DisplayName) -4)
			Dim oFileName2 As String = Right(iptPathName, Len(iptPathName) -InStrRev(iptPathName, "\"))
			'Definition du nom d'ecran de chaque pieces de l'assemblage
			Dim Name As String = oRefDoc.DisplayName
			'MessageBox.Show(Name, "Title")

			Try
				'controle des mises a plat dans les pieces de l'assemblage
				Dim oCompDef As SheetMetalComponentDefinition = oPartDoc.ComponentDefinition
				Dim oFlatPattern As FlatPattern = oCompDef.FlatPattern
				If oCompDef.HasFlatPattern = False Then
					oCompDef.Unfold
					oPartDoc.Save
				End If
				
				' edition des mises a plat
				oCompDef.FlatPattern.Edit
				ThisApplication.CommandManager.ControlDefinitions.Item("AppZoomallCmd").Execute

				Dim sOut As String
				sOut = "FLAT PATTERN DXF?AcadVersion=2007&OuterProfileLayer=IV_INTERIOR_PROFILES&InvisibleLayers=IV_TANGENT;IV_BEND;IV_BEND_DOWN;IV_TOOL_CENTER;IV_TOOL_CENTER__DOWN;IV_ARC_CENTERS;IV_OUTER_PROFILE;IV_FEATURE_PROFILES;IV_FEATURE_PROFILES_DOWN;IV_ALTREP_FRONT;IV_ALTREP_BACK;IV_UNCONSUMED_SKETCHES;IV_ROLL;IV_ROLL_TANGENT"


	'Creation du nom de fichier DXF
			
				'longueur de la mise a plat
				Dim SubPartlength As Double = Round(oFlatPattern.Length, 3) * 10
				'MessageBox.Show(SubPartlength, "Title")
				'Largeur de la mise a plat
				Dim SubPartwidth As Double = Round(oFlatPattern.Width, 3) * 10
				'MessageBox.Show(SubPartwidth, "Title")
				'Epaisseur
				Dim SubPartEpais As Double = Parameter(Name, "Epaisseur")
				MessageBox.Show(SubPartEpais & " mm", "Title")
				'Matière
				Dim SubPartMat As String = iProperties.Material(Name)
				MessageBox.Show(SubPartMat, "Title")
				
				oDataMedium.FileName = Ofolder & "\" & Name & "_" & SubPartMat & "_Ep" & SubPartEpais & "_" & SubPartlength & "x" & SubPartwidth & "mm.dxf"
				oCompDef.DataIO.WriteDataToFile(sOut, oDataMedium.FileName)


			Catch
			End Try

			oPartDoc.Close
		
		End If
	End If
Next

End Sub
Message 11 sur 35

dans ta regle pour IPT, sMAT et sEP n'ont pas de reference pour recuperer les valeur dans un assemblage

sMAt = iProperties.Material
sMat = iProperties.Material(Name) ; dans ce cas, Vincent a ajouter "name" qui fait reference à la piece dans l'assemblage.
donc c'est normal qu'en l'état ta regle pour IPT ne foctionne pas pour un IAM
Message 12 sur 35

Oui, j'ai compris par la suite qu'il fallait ajouter le "name".

 

Malgré cela, si je mets sMAt = iProperties.Material(Name), ça me passe l'enregistrement du DXF.

 

Si je le mets en commentaire, le code va jusqu'au bout 🤔

Message 13 sur 35

as tu declarer "name" dans ta regle?
ou peux tu partager ta regle en entier pour que l'on puisse y voir plus clair?
Message 14 sur 35

Name n'est pas déclaré, pourtant ça fonctionne avec oFileName = Name

 

Voilà le code complet :

Sub Main()
	
 'controle que le document actif est bien un assemblage

If ThisApplication.ActiveDocument.DocumentType <> kAssemblyDocumentObject Then
	MessageBox.Show("cette règle fonctionne uniquement avec un ensemble", "iLogic")
	Return
End If

'definition du document actif comme assemblage

Dim oAsmDoc As AssemblyDocument = ThisApplication.ActiveDocument
Dim oAsmName As String = Left(oAsmDoc.DisplayName, Len(oAsmDoc.DisplayName) -4)
Dim File As String = ThisDoc.FileName(False)
Dim oDoc As String
oDoc = ThisDoc.PathAndFileName(False)
'MessageBox.Show(oDoc, "Title")

oPath = ThisDoc.Path
oDataMedium = ThisApplication.TransientObjects.CreateDataMedium
oContext = ThisApplication.TransientObjects.CreateTranslationContext
oContext.Type = IOMechanismEnum.kFileBrowseIOMechanism
'oOptions = ThisApplication.TransientObjects.CreateNameValueMap

'verification et/ou création du repertoire DXF correspondant à l'assemblage
Dim Ofolder As String
oFolder = oPath & "\" & File & "_SortiesDXF du " & DateTime.Now.ToString("dd-MM-yy")
'MessageBox.Show(oFolder, "Title")

Process.Start("explorer.exe", oFolder)
If Not System.IO.Directory.Exists(oFolder) Then
	System.IO.Directory.CreateDirectory(oFolder)
End If

'referencement des pieces de tolerie dans l'assemblage et controle de leur sauvegarde

Dim oRefDocs As DocumentsEnumerator = oAsmDoc.AllReferencedDocuments
Dim oRefDoc As Document
For Each oRefDoc In oRefDocs
	If oRefDoc.DocumentSubType.DocumentSubTypeID = "{9C464203-9BAE-11D3-8BAD-0060B0CE6BB4}" Then
		iptPathName = oRefDoc.FullDocumentName
MessageBox.Show(iptPathName, "Title")

End If

		'verification de la sauvegarde des pieces de l'assemblage

If (System.IO.File.Exists(iptPathName)) Then
			Dim oPartDoc As PartDocument = ThisApplication.Documents.Open(iptPathName, True)
			Dim oFileNameWithoutExt As String = Left(oRefDoc.DisplayName, Len(oRefDoc.DisplayName) -4)
			Dim oFileName2 As String = Right(iptPathName, Len(iptPathName) - InStrRev(iptPathName, "\"))
			'MessageBox.Show(oFileNameWithoutExt, "Title")
			'MessageBox.Show(oFileName2, "Title2")
			Dim Name As String = oRefDoc.DisplayName
MessageBox.Show(Name, "Title")

Try
		'controle des mises a plat dans les pieces de l'assemblage

			Dim oCompDef As SheetMetalComponentDefinition = oPartDoc.ComponentDefinition
			Dim oFlatPattern As FlatPattern = oCompDef.FlatPattern

If oCompDef.HasFlatPattern = False Then
	oCompDef.Unfold
	oPartDoc.Save
End If
	oCompDef.FlatPattern.Edit

Dim oOptions As NameValueMap
oOptions = ThisApplication.TransientObjects.CreateNameValueMap

Dim strIniFile As String
strIniFile = "\\Nas-tellig\communs\INVENTOR 2016\Config\Styles-TELLIG\Materials\EXPORT DXF EXT-INT-MAR.ini"
' Create the name-value that specifies the ini file to use.
oOptions.Value("Export_Acad_IniFile") = strIniFile

MessageBox.Show ("palier avant enregistrement")

'--

	' Déclaration des variables

Dim sOut As String
Dim sMat As String
Dim Epaisseur As String

MessageBox.Show ("Variables OK")

    sMAt = iProperties.Material(Name)
    'sEp = iProperties.Value("Custom", "Epaisseur")
    sOut = "FLAT PATTERN DXF?AcadVersion=2004&OuterProfileLayer=IV_INTERIOR_PROFILES"

MessageBox.Show ("mat ép")

Dim oFileName, oDxfName As String
oFileName = Name
If oFileName Is Nothing Then
MessageBox.Show ("Enregistrer le document d'abord", "iLogic")
Return

oDxfName = Left(oFileName,Len(OFileName)-3) & "dxf"

Else
oCompDef.FlatPattern.Edit
End If

	 ' Création nom du fichier

oDataMedium.FileName = Ofolder & "\" & oFileName & "_" & sMat & "_" & Epaisseur & "mm.dxf"
	
	
    MessageBox.Show("DXF SAVED TO: " & sFname ,"DXF Saved", MessageBoxButtons.OK)

    Dim oSMDef As SheetMetalComponentDefinition

oCompDef.DataIO.WriteDataToFile(sOut, oDataMedium.FileName)

Catch
End Try
End If

Next

End Sub
	

 

Message 15 sur 35
vpeuvion
en réponse à: thibault.franchini

D'accord, je comprends mieux votre problème.

Vous avez mis une partie de votre code dans un Try/Catch/End Try ce qui veut dire que si il arrive une erreur entre le try et le catch, il ne fait rien du tout et passe au suivant si vous êtes dans une boucle.

Je n'ai pas regardé le dernier code dans le détail, mais obtenir des informations dans une pièce et dans l'occurrence d'un assemblage est différente dans certains cas.

L'exemple que j'ai posté précédemment concernait un document pièce.

Voici le même principe pour obtenir les informations des occurrences d'un assemblage:

Dim oAsmDocument As AssemblyDocument = ThisDoc.Document
Dim oAsmCompDef As AssemblyComponentDefinition = oAsmDocument.ComponentDefinition
Dim oLeafOccs As ComponentOccurrencesEnumerator = oAsmCompDef.Occurrences.AllLeafOccurrences
Dim Ofolder As String = "C:\MyFolder"

For Each oOccurrence As ComponentOccurrence In oLeafOccs
	Dim oDoc As PartDocument = oOccurrence.Definition.Document
	Dim oFilename As String = Left(oDoc.DisplayName,Len(ThisDoc.Document.DisplayName)-4)
	MessageBox.Show("nom du fichier : " & oFilename)
	
	Dim oPartCompDef As SheetMetalComponentDefinition = oDoc.ComponentDefinition
	Dim Ep As Double = oPartCompDef.Thickness.Value * 10
	MessageBox.Show("Epaisseur : " & Ep)

	Dim oMaterial As Material = oPartCompDef.Material
	Dim sMat As String = oMaterial.Name
	MessageBox.Show("Matière : " & sMat)
	
	Dim oDXFFullfileName As String = Ofolder & "\" & oFilename & "_" & sMat & "_" & Ep & "mm.dxf"
	MessageBox.Show("Dxf Full file name : " & oDXFFullfileName)
Next

Lorsque vous utilisez un Try/Catch/EndTry, vous pouvez afficher l'erreur si elle se produit :

Try
	'Mon code
Catch ex As Exception
	MessageBox.Show(ex.Message)
End Try

 Ce n'est pas toujours clair mais parfois ça peut aider.

Vincent.

Message 16 sur 35
thibault.franchini
en réponse à: vpeuvion

Ok, je comprends mieux pourquoi ça saute l'enregistrement ! En mettant un messagebox dans le Try/Catch, il me note " Iproperties : le composant nommée "Piéce7" est introuvable.

 

Je pense avoir compris la routine nécessaire pour avoir les infos des occurrences de l'assemblage.

 

En revanche, je m'embrouille car le code est constitué de morceaux de code copié depuis plusieurs sources. Il va falloir que je liste un peu mieux les commandes et variables pour m'y retrouver...

 

En suivant ton dernier exemple, il me demande un "Next". Mais je ne sais pas où le mettre dans mon code sans qu'il me remonte d'autres erreurs.

Message 17 sur 35
ThomasB44
en réponse à: thibault.franchini

Pour débugger, tu as les commandes du Journal iLogic, en activant la fenêtre du même nom, et en plaçant les commandes Info/Trace/Debug/Warn/Error dans ton code en lieu et place de tes Messages Box.

Et en réglant ton niveau de journalisation en bas de ta règle.

ThomasB44_0-1701699170187.png

 


Thomas
Mechanical Designer / Inventor Professionnal 2023
Inventor Professional EESignature

Message 18 sur 35
thibault.franchini
en réponse à: ThomasB44

@ThomasB44, merci pour ton aide mais j'ai peur que cette option ne soit pas disponible sur Inventor 2016.

 

@vpeuvion, lorsque je fais un essai avec ton exemple il me demande de déclarer le "Name" lors du oMaterial.Name. Comment dois-je le déclarer ?

 

Sinon pour ma culture, je compare les exemples proposés par les différents membres et les commandes ne sont pas les mêmes bien que semblables. Je ne veux pas rentrer dans la bataille pour déterminer laquelle est la meilleure, mais plutôt connaitre leur différences :

 

- ThisDocument.Document VS ThisApplication.ActiveDocument

- DocumentsEnumerator VS ComponentOccurenceEnumerator

- AllReferenceDocuments VS Occurences.AllLeafOccurences

 

 

Message 19 sur 35
vpeuvion
en réponse à: thibault.franchini

Il ne doit pas demander de déclarer le Name de oMaterialName. Il n'est sûrement pas disponible dans l'Inventor 2016.

J'ai regardé ton code plus en détail et vu que tu utilises DocumentsEnumerator, tu peux peut-être t'en passer.

Je me suis permis de modifier quelques lignes de ton code sans toucher à la structure et ça fonctionne de mon côté.

Sub Main()
	
 'controle que le document actif est bien un assemblage

If ThisApplication.ActiveDocument.DocumentType <> kAssemblyDocumentObject Then
	MessageBox.Show("cette règle fonctionne uniquement avec un ensemble", "iLogic")
	Return
End If

'definition du document actif comme assemblage

Dim oAsmDoc As AssemblyDocument = ThisApplication.ActiveDocument
Dim oAsmName As String = Left(oAsmDoc.DisplayName, Len(oAsmDoc.DisplayName) -4)
Dim File As String = ThisDoc.FileName(False)
Dim oDoc As String
oDoc = ThisDoc.PathAndFileName(False)
'MessageBox.Show(oDoc, "Title")

oPath = ThisDoc.Path
oDataMedium = ThisApplication.TransientObjects.CreateDataMedium
oContext = ThisApplication.TransientObjects.CreateTranslationContext
oContext.Type = IOMechanismEnum.kFileBrowseIOMechanism
'oOptions = ThisApplication.TransientObjects.CreateNameValueMap

'verification et/ou création du repertoire DXF correspondant à l'assemblage
Dim Ofolder As String
Ofolder = oPath & "\" & File & "_SortiesDXF du " & DateTime.Now.ToString("dd-MM-yy")
'MessageBox.Show(oFolder, "Title")

Process.Start("explorer.exe", Ofolder)
If Not System.IO.Directory.Exists(Ofolder) Then
	System.IO.Directory.CreateDirectory(Ofolder)
End If

'referencement des pieces de tolerie dans l'assemblage et controle de leur sauvegarde

Dim oRefDocs As DocumentsEnumerator = oAsmDoc.AllReferencedDocuments
Dim oRefDoc As Document
For Each oRefDoc In oRefDocs
	If oRefDoc.DocumentSubType.DocumentSubTypeID = "{9C464203-9BAE-11D3-8BAD-0060B0CE6BB4}" Then
		iptPathName = oRefDoc.FullDocumentName
MessageBox.Show(iptPathName, "Title")

End If

		'verification de la sauvegarde des pieces de l'assemblage

If (System.IO.File.Exists(iptPathName)) Then
			Dim oPartDoc As PartDocument = ThisApplication.Documents.Open(iptPathName, True)
			Dim oFileNameWithoutExt As String = Left(oRefDoc.DisplayName, Len(oRefDoc.DisplayName) -4)
			Dim oFileName2 As String = Right(iptPathName, Len(iptPathName) - InStrRev(iptPathName, "\"))
			'MessageBox.Show(oFileNameWithoutExt, "Title")
			'MessageBox.Show(oFileName2, "Title2")
			Dim Name As String = oRefDoc.DisplayName
MessageBox.Show(Name, "Title")

Try
		'controle des mises a plat dans les pieces de l'assemblage

			Dim oCompDef As SheetMetalComponentDefinition = oPartDoc.ComponentDefinition
			Dim oFlatPattern As FlatPattern = oCompDef.FlatPattern

If oCompDef.HasFlatPattern = False Then
	oCompDef.Unfold
	oPartDoc.Save
End If
	oCompDef.FlatPattern.Edit

Dim oOptions As NameValueMap
oOptions = ThisApplication.TransientObjects.CreateNameValueMap

Dim strIniFile As String
strIniFile = "\\Nas-tellig\communs\INVENTOR 2016\Config\Styles-TELLIG\Materials\EXPORT DXF EXT-INT-MAR.ini"
' Create the name-value that specifies the ini file to use.
oOptions.Value("Export_Acad_IniFile") = strIniFile

MessageBox.Show ("palier avant enregistrement")

'--

	' Déclaration des variables

Dim sOut As String
Dim sMat As String
'Dim Epaisseur As String
Dim Ep As Double = oCompDef.Thickness.Value * 10

MessageBox.Show ("Variables OK")

    sMat = iProperties.Material(Name)
    'sEp = iProperties.Value("Custom", "Epaisseur")
    sOut = "FLAT PATTERN DXF?AcadVersion=2004&OuterProfileLayer=IV_INTERIOR_PROFILES"

MessageBox.Show ("mat ép")

Dim oFileName, oDxfName As String
oFileName = Left(Name,Len(Name)-4)
If oFileName Is Nothing Then
MessageBox.Show ("Enregistrer le document d'abord", "iLogic")
Return

oDxfName = Left(oFileName,Len(oFileName)-3) & "dxf"

Else
oCompDef.FlatPattern.Edit
End If

	 ' Création nom du fichier

oDataMedium.FileName = Ofolder & "\" & oFileName & "_" & sMat & "_" & Ep & "mm.dxf"
	
	
    MessageBox.Show("DXF SAVED TO: " & sFname ,"DXF Saved", MessageBoxButtons.OK)

    Dim oSMDef As SheetMetalComponentDefinition

oCompDef.DataIO.WriteDataToFile(sOut, oDataMedium.FileName)
oPartDoc.Close(True)
Catch
End Try
End If

Next

End Sub

Pour ce qui est des différences entre les exemples de code : Il y a plusieurs façon d'accéder au même résultat, tout dépend de l'utilisateur et des spécificités de son cas d'utilisation.

ThisDoc.Document : Le document dans lequel la règle est écrite.

ThisApplication.ActiveDocument : Le document actif de l'application Inventor.

Dans la majorité des cas ce sera le même document, mais dans certains cas ils peuvent donner des résultats différents.

DocumentsEnumerator : Enumération des documents de l'assemblage.

ComponentOccurenceEnumerator : Enumération des occurrences de l'assemblage.

Ils se situent à des niveaux différents : Document = Occurrence.Definition.Document 

Il y a pas mal de questions de ce genre sur le forum.

https://forums.autodesk.com/t5/inventor-programming-ilogic/thisdoc-document-vs-thisapplication-activ...

https://forums.autodesk.com/t5/inventor-programming-ilogic/componentoccurrence-vs-allreferenceddocum...

Vincent.

Message 20 sur 35
thibault.franchini
en réponse à: vpeuvion

C'est bon, ça a fonctionné hier soir ! 👌

 

Je pense que le problème venait d'un erreur de recopie au niveau de "Dim oMaterial as Material" car j'avais noté as string ...

 

@vpeuvionmerci pour tes explications, je vais regarder ton code proposé en détails pour lister les différences, il sera certainement plus lisible et compréhensible.

 

Plusieurs points pour parfaire cette règle :

 

- Est-il possible de fermer les ipt après export du dxf. Car il les ouvre une à une et basta.

- A la fin j'ai un messagebox avec qui indique que l'export est OK avec le chemin. Est-il possible d'afficher le nombre de DXF généré ?

- La recherche qui permet de lister les pièces de tôlerie utilise :

 

If oRefDoc.DocumentSubType.DocumentSubTypeID = "{9C464203-9BAE-11D3-8BAD-0060B0CE6BB4}" Then

Dans mon précédent code, l'ID était 4D29B490-49B2-11D0-93C3-7E0706000000. Y a-t-il possibilité de l'écrire d'une manière plus lisible ?

 

Encore merci à tous pour votre aide et votre patience !

Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.

Publier dans les forums  

Autodesk Design & Make Report