Bonjour à toutes et à tous,
Je suis occupé à configurer une plan 2d avec ilogic. Je souhaiterais faire une vue de détails avec une règle ilogic. Ma règle fonctionne mais la vue de détail pointe sur une curve aléatoirement. Je souhaiterais que la vue de détails pointe sur une courbe que j'ai appelé "Mur_PP" dans mon 3D.
La vue de détails doit pointer sur un Point2d. Mais je n'arrive pas à convertir ma curve "Mur_PP" en Point2d.
Est-ce que quelqu'un pourrais me dire comment avancé sur mon problème.
Dans ma règle ci-dessous, la curve "Item(6) devrait être remplacée par la courbe "Mur_PP".
Je joins des fichier exemples. La règle s'appelle vue de détails dans le plan 2d.
Merci d'avance.
Louis-Philippe
Sub Main() Dim oDrawing As DrawingDocument = ThisApplication.ActiveDocument Dim oSheet As Sheet = oDrawing.ActiveSheet Dim oView As DrawingView = oSheet.DrawingViews.Item(1) Dim oReferDoc As AssemblyDocument = oView.ReferencedDocumentDescriptor.ReferencedDocument Dim oAssyDef As AssemblyComponentDefinition = oReferDoc.ComponentDefinition Dim Occ As ComponentOccurrence Dim oCurve As DrawingCurve Dim oLine As DrawingCurve Dim oTG As TransientGeometry = ThisApplication.TransientGeometry If oView.DrawingCurves(Occ).Count > 0 Then Dim oCollection As ObjectCollection = ThisApplication.TransientObjects.CreateObjectCollection Dim oCurves As DrawingCurvesEnumerator = oView.DrawingCurves(Occ) For Each oCurve In oCurves If oCurve.CurveType = kLineSegmentCurve Then Call oCollection.Add(oCurve) End If Next oLine = oCurves.Item(6) End If Dim Test_1 = ThisDrawing.Sheets.ItemByName("Test:1") Dim VUE1 = Test_1.DrawingViews.ItemByName("VUE1") Dim Mur_PP = VUE1.GetIntent("Maconnerie test:1", "Mur PP") Dim oMidpoint As Point2d Dim oStartpoint As Point2d Dim oEndpoint As Point2d Dim oMurPPPoint As Point2d Dim oGeometryIntent As GeometryIntent ' oMurPPPoint =oSheet.CreateGeometryIntent(Mur_PP, PointIntentEnum.kEndPointIntent) oMidpoint = oLine.MidPoint oStartpoint = oLine.StartPoint oEndpoint = oLine.EndPoint ' oGeometryIntent = oSheet.CreateGeometryIntent(oLine, PointIntentEnum.kEndPointIntent) ' ' Set a reference to the TransientGeometry object. Dim PmX As Double = oMidpoint.X Dim PmY As Double = oMidpoint.Y Dim PsX As Double = oStartpoint.X Dim PsY As Double = oStartpoint.Y Dim PeX As Double = oEndpoint.X Dim PeY As Double = oEndpoint.Y ' Set a reference to the parent drawing view of the selected curve Dim oDrawingView As DrawingView = oCurve.Parent oTG = ThisApplication.TransientGeometry 'Dimension de la box de la DetailViewometry EscGPosA = oTG.CreatePoint2d(PeX-1, PeY+1) EscGPosB = oTG.CreatePoint2d(PeX+3, PeY-3) 'Position de la vue de détail oPoint = oTG.CreatePoint2d(0, 0) oPoint.X = oPoint.X + 5 oPoint.Y = oPoint.Y + 5 Dim oDetailView As DetailDrawingView oDetailView = oSheet.DrawingViews.AddDetailView(oDrawingView, oPoint,kFromBaseDrawingViewStyle, False, EscGPosA, EscGPosB, , oDrawingView.Scale * 2) End Sub
Résolu ! Accéder à la solution.
Résolu par ThomasB44. Accéder à la solution.
Rebonjour à tous,
Je ne sais pas ce sujet n'intéresse personne ou je me suis mal exprimé dans l'explication de mon problème.
L'objectif est de faire une vue de détail avec Ilogic. Je souhaite que le l’extrémité de ma ligne que j'ai appelé (Mur_PP) dans ma pièce soit le départ de la zone de la vue de détail. (image ci-dessous). J'ai posté ci-dessus un exemple.
Je suis coincé depuis un moment là dessus, et je ne trouve pas d'info sur le Web.
🙏Merci de pouvoir m'aider.
Louis-Philippe
Bonjour @louisphilippe.dujardin ,
Votre question est parfaitement claire et très bien rédigée.
Mais malheureusement notre expert iLogic à très peu de temps en ce moment... Je vois que vous avez posé la question sur le forum anglais également mais que vous n'avez pas eu de réponse encore, peut-être en ouvrant un nouveau sujet vous aurez plus de chance ?
Fabian Perrée
Giùp.fr | LinkedIn
Ce post vous a été utile ? N'hésitez pas à aimer ce post.
Ce post a-t-il répondu à votre question ? Cliquez sur le bouton Accepter la solution.
Salut @louisphilippe.dujardin
Désolé de cette réponse très tardive.
Après lecture de ton code, je vois premièrement des incohérences. Doubles déclarations pour les mêmes éléments...une boucle dont tu ne te sers pas au final. Des variables inutilisées...
Une première piste, la ligne de géométrie que tu as renommée "Mur_PP" est un libellé dans l'environnement pièce que tu peux aller chercher comme ceci, toujours dans l'environnement pièce :
Sub ToggleGeometryNameGraphics() Dim sGeometryName As String sGeometryName = "Mur_PP" Dim oDoc As PartDocument Set oDoc = ThisApplication.ActiveDocument Dim oGraphicsColl As ClientGraphicsCollection Set oGraphicsColl = oDoc.ComponentDefinition.ClientGraphicsCollection Dim oClientGraphics As ClientGraphics Dim oNode As GraphicsNode For Each oClientGraphics In oGraphicsColl If oClientGraphics.ClientId = "NamedEntityGraphicsID" Then For Each oNode In oClientGraphics If oNode.DisplayName = sGeometryName Then oNode.Visible = Not oNode.Visible oDoc.Update End If Next End If Next End Sub
Le code ci-dessus fonctionne dans l'environnement pièce, mais pas dans l'environnement dessin.
Bien que la commande "capturer l'état actuel" de la ligne permette d'y accéder directement, depuis l'environnement de la pièce ou du dessin, les manipulations en iLogic pur sont très limitées. La fonction est relativement nouvelle, et la documentation, très limitée également.
J'essaierai de faire davantage de recherches sur le sujet 😉
Thomas
Mechanical Designer / Inventor Professionnal 2025
Bonjour @ThomasB44 ,
Je te remercie d'avoir pris le temps de lire mon sujet, je n'y croyais plus. 😉
Effectivement, il y a beaucoup de choses inutilisées dans mon code, ce sont les restes de tout ce que j' ai essayé ainsi que d'éléments que j'aurai sans doute besoin pour la suite.
J'avoue ne pas bien comprendre le fonctionnement de ton code. l'objectif de ce que je cherche a faire est de pointer la box de la Vue de Détails sur un élément géométrique de la pièce.
Il n'y a effectivement pas beaucoup de documentation à ce sujet.
J'avoue que je ne vois toujours pas comment avancer plus loin.
Je te remercie pour ton temps.
Louis-Philippe
Salut @louisphilippe.dujardin
Le code que j'ai indiqué permet juste, dans l'environnement pièce, de retrouver la ligne que tu as renommée. Le code oNode.Visible est juste un exemple, on pourrait très bien faire autre chose à la place. oNode représente ici ton libellé "Mur_PP".
Pour créer la vue de détail, pas de soucis, ton code est correct.
La difficulté majeure est de passer du libellé "Mur_PP" à la DrawingCurve qu'il représente, et ce, dans l'environnement de dessin !
J'ai essayé, mais en vain pour le moment.
Je vais retenter ma chance.
Thomas
Mechanical Designer / Inventor Professionnal 2025
Salut @louisphilippe.dujardin
J'ai fini par comprendre...
Déjà en français ça s'appelle un "libellé" et en anglais c'est "named geometry", c'est pour ça qu'on trouvait rien ou presque. Ensuite il fallait savoir utiliser l'Attribute Manager en filtrant sur les objets iLogic renommés.
Teste cette règle dans l'environnement de dessin en renommant le libellé de ta pièce "Libellé de géométrie" ou bien dans le code :
Dim oDoc As DrawingDocument oDoc = ThisApplication.ActiveDocument Dim oSheet As Sheet oSheet = oDoc.ActiveSheet Dim oView As DrawingView oView = oSheet.DrawingViews.Item(1) Dim oRefDoc As PartDocument oRefDoc = oView.ReferencedDocumentDescriptor.ReferencedDocument Dim oObjColl As ObjectCollection oObjColl = ThisApplication.TransientObjects.CreateObjectCollection oObjColl = oRefDoc.AttributeManager.FindObjects("iLogicEntityNameSet", "iLogicEntityName", "Libellé de géométrie") Dim oObj As Object oObj = oObjColl.Item(1) Dim oDwgCurve As DrawingCurve oDwgCurve = oView.DrawingCurves(oObj).Item(1) Dim oPoint As Point2d oPoint = oDwgCurve.MidPoint Dim oTG As TransientGeometry oTG = ThisApplication.TransientGeometry Dim oCornerOne As Point2d oCornerOne = oTG.CreatePoint2d(oPoint.X - 2 , oPoint.Y - 2) Dim oCornerTwo As Point2d oCornerTwo = oTG.CreatePoint2d(oPoint.X + 2 , oPoint.Y + 2) Dim oDetailView As DetailDrawingView oDetailView = oSheet.DrawingViews.AddDetailView(oView, oPoint, _ kFromBaseDrawingViewStyle, False, oCornerOne, oCornerTwo, , oView.Scale * 2)
Thomas
Mechanical Designer / Inventor Professionnal 2025
Bonjour Thomas,
Merci beaucoup pour tes recherches, effectivement en cherchant "named geometry" , on trouve plus d'info.
J'ai appliqué ton code, et il m'indiquait un message d'erreur.
Après avoir cherché, je me suis rendu compte que ma vue contient un assemblage et pas une pièce.
En appliquant ton code à une vue qui contient une pièce, ça fonctionne parfaitement.
J'ai adapté ton code en remplaçant
Dim oRefDoc As PartDocument
Par
Dim oRefDoc As AssemblyDocument
et en adaptant le libellé de la géométrie par
oObjColl = oRefDoc.AttributeManager.FindObjects(,"Maconnerie test:1", "Mur PP")
Mais ça ne fonctionne pas. il me met : "Paramètre incorrect. (Exception de HRESULT : 0x80070057 (E_INVALIDARG))"
Je ne suis pas certain de bien définir le libellé de la géométrie lorsqu'il fait partie d'une pièce d'un assemblage.
En cherchant un peu, j'ai l’impression que ça ne fonctionne pas encore dans le cas d'un assemblage.
on avance! je continue aussi à chercher.
Merci beaucoup.
Salut @louisphilippe.dujardin
Les libellés n'existent que dans l'environnement pièce. Je ne savais pas qu'il s'agissait d'un ensemble.
Le problème est effectivement la déclaration de oRefDoc. Il faudrait savoir comment retrouver la pièce qui contient le libellé. On peut changer le code pour l'adapter à un assemblage, mais as tu une règle logique pour trouver la bonne pièce ? A moins de boucler sur toutes les occurrences jusqu'à trouver le bon libellé, mais l'exécution du code prendra plus de temps.
Thomas
Mechanical Designer / Inventor Professionnal 2025
Salut @ThomasB44 ,
Je pense qu'on peut essayer de trouver la première occurrence de l’assemblage.
et dans cette occurrence qui est une Pièce, rechercher l'objet "Mur PP".
Je m'arrange pour que la pièce soit en 1er.
Je viens d'essayer mais je bloque.
On peut essayer de boucler, il n'y a pas beaucoup de pièces.
Il y a une petite astuce...il faut passer par EdgeProxy
Ce code regarde dans la 1ère occurrence de l'ensemble :
Dim oDoc As DrawingDocument oDoc = ThisApplication.ActiveDocument Dim oSheet As Sheet oSheet = oDoc.ActiveSheet Dim oView As DrawingView oView = oSheet.DrawingViews.Item(1) Dim oRefDoc As AssemblyDocument oRefDoc = oView.ReferencedDocumentDescriptor.ReferencedDocument Dim oOcc As ComponentOccurrence oOcc = oRefDoc.ComponentDefinition.Occurrences.Item(1) Dim oPartDoc As PartDocument oPartDoc = oOcc.Definition.Document Dim oObjColl As ObjectCollection oObjColl = ThisApplication.TransientObjects.CreateObjectCollection oObjColl = oPartDoc.AttributeManager.FindObjects("iLogicEntityNameSet", "iLogicEntityName", "Libellé de géométrie") Dim oEdge As Inventor.Edge oEdge = oObjColl.Item(1) Dim oEdgeProxy As Inventor.EdgeProxy oOcc.CreateGeometryProxy(oEdge, oEdgeProxy) Dim oDrawCurves As DrawingCurvesEnumerator oDrawCurves = oView.DrawingCurves(oEdgeProxy) Dim oDwgCurve As DrawingCurve oDwgCurve = oDrawCurves.Item(1) Dim oPoint As Point2d oPoint = oDwgCurve.MidPoint Dim oTG As TransientGeometry oTG = ThisApplication.TransientGeometry Dim oCornerOne As Point2d oCornerOne = oTG.CreatePoint2d(oPoint.X - 2 , oPoint.Y - 2) Dim oCornerTwo As Point2d oCornerTwo = oTG.CreatePoint2d(oPoint.X + 2 , oPoint.Y + 2) Dim oDetailView As DetailDrawingView oDetailView = oSheet.DrawingViews.AddDetailView(oView, oPoint, _ kFromBaseDrawingViewStyle, False, oCornerOne, oCornerTwo, , oView.Scale * 2)
Thomas
Mechanical Designer / Inventor Professionnal 2025
Lorsqu'il exécute la règle, il me met une erreur lorsqu'il déclare oEdge.
Dim oEdge As Inventor.Edge oEdge = oObjColl.Item(1)
Par contre il trouve bien 'Mur PP' dans la première occurrence de l’assemblage.
Par contre une question un peu plus générale, je ne comprend pas bien le concept de 'Proxy'.
On avance, je pense qu'on est proche d'y arriver.
merci beaucoup pour ta recherche et ton partage d'info.
Bizarre, je n'ai pas d'erreur de mon côté.
Cette ligne de code :
oEdge = oObjColl.Item(1)
Peut retourner une erreur si oObjColl est vide.
Place une boite de message avant cette ligne, et renseigne ceci pour voir : oObjColl.Count
Les proxies permettent de manipuler des objets dans un contexte. C'est assez rare d'avoir à s'en servir, mais je n'y arrivais pas autrement.
Thomas
Mechanical Designer / Inventor Professionnal 2025
Il me retourne bien : 1
et effectivement sur
oEdge = oObjColl.Item(2)
et me donne erreur de paramètre ce qui est logique car que 1 objet dans la collection.
Salut @ThomasB44,
Je viens de comprendre pourquoi il me met ce message d'erreur.
L'objet "Mur PP" est une face dans ma pièce et pas une arrête.
Soit je nome l’arrête supérieur de ma surface ou bien il y a moyen de de viser sur la surface.
En référencent une arrête ça marche en tout cas.
Yeeeeeeesssss !!!!
J'ai modifié mon code en faisant une faceproxy et plus une Edge proxy.
Dim oDoc As DrawingDocument oDoc = ThisApplication.ActiveDocument Dim oSheet As Sheet oSheet = oDoc.ActiveSheet Dim oView As DrawingView oView = oSheet.DrawingViews.Item(1) Dim oRefDoc As AssemblyDocument oRefDoc = oView.ReferencedDocumentDescriptor.ReferencedDocument Dim oOcc As ComponentOccurrence oOcc = oRefDoc.ComponentDefinition.Occurrences.Item(2) Dim oPartDoc As PartDocument oPartDoc = oOcc.Definition.Document Dim oObjColl As ObjectCollection oObjColl = ThisApplication.TransientObjects.CreateObjectCollection oObjColl = oPartDoc.AttributeManager.FindObjects(, , "Mur PP") Dim oFace As Inventor.Face oFace = oObjColl.Item(1) Dim oFaceProxy As Inventor.FaceProxy oOcc.CreateGeometryProxy(oFace, oFaceProxy) Dim oDrawCurves As DrawingCurvesEnumerator oDrawCurves = oView.DrawingCurves(oFaceProxy) Dim oDwgCurve As DrawingCurve oDwgCurve = oDrawCurves.Item(1) Dim oPoint As Point2d oPoint = oDwgCurve.MidPoint Dim oTG As TransientGeometry oTG = ThisApplication.TransientGeometry Dim oCornerOne As Point2d oCornerOne = oTG.CreatePoint2d(oPoint.X - 2 , oPoint.Y - 2) Dim oCornerTwo As Point2d oCornerTwo = oTG.CreatePoint2d(oPoint.X + 2 , oPoint.Y + 2) Dim oDetailView As DetailDrawingView oDetailView = oSheet.DrawingViews.AddDetailView(oView, oPoint, _ kFromBaseDrawingViewStyle, False, oCornerOne, oCornerTwo, , oView.Scale * 2)
Et ça marche... MERCI MERCI.....
S'il te renvoie 0 sans produire d'erreur, c'est que le code est correct.
Attention tu as mis :
oOcc = oRefDoc.ComponentDefinition.Occurrences.Item(2)
Il regarde donc la 2ème occurrence de ton assemblage.
Messagebox.Show("Nom de l'occurrence : " & oOcc.Name,"iLogic")
Qui ne doit pas contenir de libellé selon ton critère de recherche.
Thomas
Mechanical Designer / Inventor Professionnal 2025
Quand Je fais
MessageBox.Show(oObjColl.Count, "Ilogic")
il me renvois bien : 1
Mais c'est a l’étape suivante
Dim oFaceProxy As Inventor.FaceProxy oOcc.CreateGeometryProxy(oFace, oFaceProxy) Dim oDrawCurves As DrawingCurvesEnumerator oDrawCurves = oView.DrawingCurves(oFaceProxy) MessageBox.Show(oDrawCurves.Count, "Title") Dim oDwgCurve As DrawingCurve oDwgCurve = oDrawCurves.Item(1)
Là il me renvoie 0 alors que le même code dans mon ensemble Sample fonctionne bien( renvoie 1).
Est-ce que quelque chose pourrait l’empêcher de créer oDrawcurves?
Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.