bazoul
Membres-
Compteur de contenus
116 -
Inscription
-
Dernière visite
-
Jours gagnés
1
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par bazoul
-
Dans barre d’outils de l’éditeur VB > Outils / Références Boite dialogue ‘Références- Project’ > cliquez sur ‘Parcourir’ Boite d’invite ‘Ajouter une référence’ : Type de fichier > sélectionner Contrôles ActiveX (*.ocx) Sélectionner le fichier nommé MSCOMCTL.OCX Dans la boite a outils,clic droit >Controle supplémentaire et sélectionne Mircrosoft Treeview control.. infos trouvé sur http://www.commentcamarche.net/forum/affich-3871253-treeview-excel et tester sur word chez moi Cordialement,
-
Bonjour,je voudrais savoir si quelqu'un aurait connaissance d'un objet windows qui serait un équivalent d'une polyligne autocad ... La finalité serait un algo qui se baserait sur windows et qui me dirait si un point serait ou non a l'intérieur de cette 'polyligne' windows ... Ok alors je rejoute quelques informations ... a partir d'une liste de points ou une liste d'entité AutoCad ou encore d'une polyligne,on peux obtenir un Objet de type System.Drawing.Drawing2D.GraphicsPath. Sur cette objet se trouve la méthode IsOutlineVisible,qui nous renseigne si le point que l'on veux tester est ou non dans la polyligne. Cool up je dirais,sauf que .... en voulant pousser le bouchon un poil plus loin,je me suis dis que l'on pourrais peut etre se prendre deux polyligne fermée qui se croisent,en faire des région ( au sens windows ),les unir et récupérer le contour ... En réalité,une fois que l'on a obtenu deux GraphicsPath correspondant au deux polyligne ( au sens windows ) représentant les deux polylignes ( au sens autocad! ) on peux faire des région de type System.Drawing.Region pour ensuite les unir par exemple ... La ou je bute du coup maintenant,c'est dans la récupération du contour de la région finale ... microsotf doit bien garder dans un coin la liste des points qui constitue cette région graphique ... autrement comment pourrait il nous dire si un points est contenu dans cette derniere?!! Toutes informations relatives a mon problème est la bienvenue ... Cordialement, [Edité le 9/6/2011 par bazoul]
-
Bonjour a vous, Voila,je voudrais en partant du xsd visio fourni par microsoft obtenir une classe ... seulement voila, xsd.exe ne donne rien car il y a des erreurs dans le fichier fourni par microsoft .. A terme l'idée c'est : j'enregistre un fichier visio en xml,puis je le charge dans un dataset personnalisé avec comme schéma justement le fichier visio.xsd ... J'ai pas forcément envie de me repalucher le boulot de récupération des données a la main voyez vous ... Any Ideas?
-
étrange ma réponse n'a pas apparu,dommage yavais tous ce qui fallait avec les arcs et tous le toutim !
-
Salut l'ami. Je te propose cette classe.Bon je te l'accorde ya un peu de ménage a faire dans le code ( genre des commentaires inutiles et des commentaires utile qui sont absent! ) Maintenant,si tu as aucune notion dans le langage ce code risque d'etre un peu compliqué,analyse un peu ce qu'il fait,et si besoin demande des précisions. La code est en managé: ''' ''' Class permettant de créer une polyligne en intégrant les arcs ''' ''' Source : http://through-the-interface.typepad.com/through_the_interface/2010/12/jigging-an-autocad-polyline-with-arc-segments-using-net.html Public Class BulgePolyJig Inherits EntityJig #Region "Déclaration interne" Private _tempPoint As Point3d = Nothing Private _plane As Plane = Nothing Private _isArcSeg As Boolean = False Private _isUndoing As Boolean = False Private _isClosed As Boolean = False Private _allowArc As Boolean = False Private _RigthClickClose As Boolean = False Private _ucs As Matrix3d = Nothing Private _MiddlePoint As Point3d = Nothing #End Region Private mLineTypeId As ObjectId = GetLineTypeIdFromLineTypeName("CACHE") ''' ''' Constructeur ''' ''' SCU dans lequel faire les calculs ''' Type de ligne Public Sub New(ByVal ucs As Matrix3d, ByVal LineTypeName As String) MyBase.New(New Polyline) Dim pline As Polyline = Nothing Dim normal As Vector3d = Nothing Try mLineTypeId = GetLineTypeIdFromLineTypeName(LineTypeName) _ucs = ucs normal = Vector3d.ZAxis.TransformBy(ucs) _plane = New Plane(Point3d.Origin, normal) pline = TryCast(Me.Entity, Polyline) pline.SetDatabaseDefaults() pline.Normal = normal AddDummyVertex() Catch ex As Exception Throw ex End Try End Sub ''' ''' Constructeur ''' ''' Type de ligne ''' Le scu utilisé pour les calculs est le scu courant. Sub New(Optional ByVal LineTypeName As String = "") MyBase.New(New Polyline) Dim pline As Polyline = Nothing Dim normal As Vector3d = Nothing Try If LineTypeName.Trim <> "" Then mLineTypeId = GetLineTypeIdFromLineTypeName(LineTypeName) _ucs = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem normal = Vector3d.ZAxis.TransformBy(_ucs) _plane = New Plane(Point3d.Origin, normal) pline = TryCast(Me.Entity, Polyline) pline.SetDatabaseDefaults() pline.Normal = normal AddDummyVertex() Catch ex As Exception Throw ex End Try End Sub ''' ''' Récupérer l'objetID d'un type de ligne à partir de son nom ''' ''' Nom du type de ligne ''' ObjectId du type de ligne Protected Function GetLineTypeIdFromLineTypeName(ByVal TypeName As String) As ObjectId Dim db As Database = Nothing Dim tm As DBTransMan = Nothing Dim tr As Transaction = Nothing Dim bt As LinetypeTable = Nothing 'gestion de la transaction Try db = HostApplicationServices.WorkingDatabase tm = db.TransactionManager tr = tm.StartTransaction bt = CType(tm.GetObject(db.LinetypeTableId, OpenMode.ForRead, False), LinetypeTable) Return bt.Item(TypeName) ''Dim btr As LinetypeTableRecord = CType(tm.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite, False), LinetypeTableRecord) Catch Return Nothing Finally If Not tr Is Nothing Then tr.abort() : tr.dispose() End Try End Function Protected Overrides Function Sampler(ByVal prompts As JigPrompts) As SamplerStatus Dim jigOpts As New JigPromptPointOptions() Dim pline As Polyline = Nothing Dim msgAndKwds As String = "" Dim kwds As String = "" Dim res As PromptPointResult = Nothing Try jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates Or UserInputControls.NullResponseAccepted Or UserInputControls.NoNegativeResponseAccepted) _isUndoing = False pline = TryCast(Me.Entity, Polyline) If pline.NumberOfVertices = 1 Then ' For the first vertex, just ask for the point jigOpts.Message = vbLf & "Sélectionner le point de départ :" ElseIf pline.NumberOfVertices > 1 Then If _isArcSeg Then If _MiddlePoint.X = 0 AndAlso _MiddlePoint.Y = 0 AndAlso _MiddlePoint.Z = 0 Then msgAndKwds = "Sélectionner le point se trouvant sur l'arc ou [undo]: " kwds = "Undo" Else msgAndKwds = "Sélectionner le point d'arrivé de l'arc ou [Line/Undo/Clore]: " kwds = "Line Undo Clore" End If Else If _allowArc Then msgAndKwds = vbLf & "Sélectionner le point suivant ou [Arc/Undo/Clore]: " kwds = "Arc Undo Clore" Else msgAndKwds = vbLf & "Sélectionner le point suivant ou [undo/Clore]: " kwds = "Undo Clore" End If End If jigOpts.SetMessageAndKeywords(msgAndKwds, kwds) Else Return SamplerStatus.Cancel End If ' Should never happen ' Get the point itself res = prompts.AcquirePoint(jigOpts) If res.Status = PromptStatus.Keyword Then If res.StringResult.ToUpper() = "ARC" Then _isArcSeg = True ElseIf res.StringResult.ToUpper() = "LINE" Then _isArcSeg = False ElseIf res.StringResult.ToUpper() = "UNDO" Then _isUndoing = True _isArcSeg = False ElseIf res.StringResult.ToUpper() = "CLORE" Then _isClosed = True Else MsgBox("Error") End If Return SamplerStatus.OK ElseIf res.Status = PromptStatus.OK Then ' Check if it has changed or not (reduces flicker) If _tempPoint = res.Value Then Return SamplerStatus.NoChange Else _tempPoint = res.Value Return SamplerStatus.OK End If ElseIf res.Status = PromptStatus.None Then If pline.NumberOfVertices <= 1 Then Return SamplerStatus.Cancel End If If _RigthClickClose Then _isClosed = True End If Return SamplerStatus.OK End If Return SamplerStatus.Cancel Catch ex As Exception Throw ex End Try End Function ''' ''' Fonction de mise a jour du jig ''' Protected Overrides Function Update() As Boolean Dim pl As Polyline = Nothing Dim refDir As Vector3d = Nothing Dim lastVertex As Point3d = Nothing, pt As Point3d = Nothing Dim arcSegment As CircularArc3d = Nothing Dim tangent As Line3d = Nothing Dim angle As Double = 0, bulge As Double = 0 Try ' Update the dummy vertex to be our 3D point ' projected onto our plane pl = TryCast(Me.Entity, Polyline) If _isArcSeg Then 'Si le point du milieu n'est pas défini en mode arc,alors l'utilisateur doit cliquer un point de l'arc If _MiddlePoint.X = 0 AndAlso _MiddlePoint.Y = 0 AndAlso _MiddlePoint.Z = 0 Then pl.SetBulgeAt(pl.NumberOfVertices - 2, 0) Else 'Le point du milieu est défini,alors on dessine l'arc passant par le point du milieu lastVertex = pl.GetPoint3dAt(pl.NumberOfVertices - 2) If pl.NumberOfVertices < 3 Then refDir = New Vector3d(1.0, 1.0, 0.0) pt = pl.GetPoint3dAt(pl.NumberOfVertices - 2) refDir = New Vector3d(_MiddlePoint.X - pt.X, _MiddlePoint.Y - pt.Y, _MiddlePoint.Z - pt.Z) Else ' Check bulge to see if last segment was an arc or a line If pl.GetBulgeAt(pl.NumberOfVertices - 3) <> 0 Then arcSegment = pl.GetArcSegmentAt(pl.NumberOfVertices - 3) tangent = arcSegment.GetTangent(lastVertex) ' Reference direction is the invert of the arc tangent ' at last vertex refDir = tangent.Direction.MultiplyBy(-1.0) Else pt = pl.GetPoint3dAt(pl.NumberOfVertices - 2) refDir = New Vector3d(_MiddlePoint.X - pt.X, _MiddlePoint.Y - pt.Y, _MiddlePoint.Z - pt.Z) End If End If angle = ComputeAngle(_MiddlePoint, _tempPoint, refDir, _ucs) ' Bulge is defined as tan of one fourth of included angle ' Need to double the angle since it represents the included ' angle of the arc ' So formula is: bulge = Tan(angle * 2 * 0.25) bulge = Math.Tan(angle * 0.5) pl.SetBulgeAt(pl.NumberOfVertices - 2, bulge) End If Else 'en mode LINE,on remet a vide le point du milieu _MiddlePoint = Nothing ' Line mode. Need to remove last bulge if there was one If pl.NumberOfVertices > 1 Then pl.SetBulgeAt(pl.NumberOfVertices - 2, 0) End If End If pl.SetPointAt(pl.NumberOfVertices - 1, _tempPoint.Convert2d(_plane)) Return True Catch ex As Exception Return False End Try End Function #Region "Partie Publique" ''' ''' Permet de saisir une polyligne dans autocad ''' Public Sub Draw() Dim ed As Editor = Nothing Dim jig As BulgePolyJig = Nothing Dim res As PromptResult = Nothing Try ed = Application.DocumentManager.MdiActiveDocument.Editor While True res = ed.Drag(Me) Select Case res.Status ' New point was added, keep going Case PromptStatus.OK AddDummyVertex() Exit Select ' Keyword was entered Case PromptStatus.Keyword If _isUndoing Then RemoveLastVertex() End If If _isClosed Then ClosePolyline() Exit While End If Exit Select ' If the jig completed successfully, add the polyline Case PromptStatus.None If _isClosed Then ClosePolyline() Else RemoveLastVertex() End If Exit While Case Else ' User cancelled the command, get out of here ' and don't forget to dispose the jigged entity Me.Entity.Dispose() Exit While End Select End While Catch ex As Exception Throw ex End Try End Sub ''' ''' Ajoute un point nul a la polyligne ''' ''' Aucune idée de pourquoi Public Sub AddDummyVertex() Dim pline As Polyline = Nothing Try pline = TryCast(Me.Entity, Polyline) If _isClosed Then Return ' Create a new dummy vertex... can have any initial value 'On est sur un arc If _isArcSeg Then 'Si le point milieu est vide alors on affecte le dernier point en tant que point milieu If _MiddlePoint.X = 0 AndAlso _MiddlePoint.Y = 0 AndAlso _MiddlePoint.Z = 0 Then _MiddlePoint = pline.GetPoint3dAt(pline.NumberOfVertices - 1) Else pline.AddVertexAt(pline.NumberOfVertices, New Point2d(0, 0), 0, 0, 0) _isArcSeg = False End If Else pline.AddVertexAt(pline.NumberOfVertices, New Point2d(0, 0), 0, 0, 0) End If Catch ex As Exception Throw ex End Try End Sub ''' ''' Supprime le dernier sommet de la polyligne ''' Public Sub RemoveLastVertex() Dim pline As Polyline = Nothing Dim blg As Double = 0 Try pline = TryCast(Me.Entity, Polyline) ' Let's first remove our dummy vertex If pline.NumberOfVertices <= 1 Then Entity.Dispose() Exit Sub End If ' And then check the type of the last segment If pline.NumberOfVertices >= 2 Then blg = pline.GetBulgeAt(pline.NumberOfVertices - 2) pline.RemoveVertexAt(pline.NumberOfVertices - 1) _isArcSeg = (blg <> 0) End If Catch ex As Exception Throw ex End Try End Sub ''' ''' Ferme la polyligne ''' ''' Prends en compte si le dernier segment est une ligne ou un arc Public Sub ClosePolyline() Dim pline As Polyline = Nothing Dim blg As Double = 0 Dim pt As Point3d, lastVertex As Point3d Dim refDir As Vector3d Dim angle As Double, bulge As Double Try pline = TryCast(Me.Entity, Polyline) If _isArcSeg Then lastVertex = pline.GetPoint3dAt(pline.NumberOfVertices - 2) ' Check bulge to see if last segment was an arc or a line If pline.GetBulgeAt(pline.NumberOfVertices - 3) <> 0 Then refDir = pline.GetArcSegmentAt(pline.NumberOfVertices - 3).GetTangent(lastVertex).Direction.MultiplyBy(-1.0) Else pt = pline.GetPoint3dAt(pline.NumberOfVertices - 2) refDir = New Vector3d(_MiddlePoint.X - pt.X, _MiddlePoint.Y - pt.Y, _MiddlePoint.Z - pt.Z) End If angle = ComputeAngle(_MiddlePoint, pline.GetPoint3dAt(0), refDir, _ucs) ' Bulge is defined as tan of one fourth of included angle ' Need to double the angle since it represents the included ' angle of the arc ' So formula is: bulge = Tan(angle * 2 * 0.25) bulge = Math.Tan(angle * 0.5) pline.SetBulgeAt(pline.NumberOfVertices - 2, bulge) End If 'Le dernier point correspond toujours au point temporaire de la position de la souris pline.RemoveVertexAt(pline.NumberOfVertices - 1) pline.Closed = True : _isClosed = True Catch ex As Exception Throw ex End Try End Sub ''' ''' Ajoute la polyligne au ModelSpace ''' Public Sub Append() Dim bt As BlockTable = Nothing Dim btr As BlockTableRecord = Nothing Try Using tr As Transaction = HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction bt = TryCast(tr.GetObject(HostApplicationServices.WorkingDatabase.BlockTableId, OpenMode.ForRead), BlockTable) btr = TryCast(tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord) btr.AppendEntity(Me.Entity) tr.AddNewlyCreatedDBObject(Me.Entity, True) tr.Commit() End Using Catch ex As Exception Throw ex End Try End Sub ' Custom ArcTangent method, as the Math.Atan ' doesn't handle specific cases Public Shared Function Atan(ByVal y As Double, ByVal x As Double) As Double If x > 0 Then Return Math.Atan(y / x) ElseIf x < 0 Then Return Math.Atan(y / x) - Math.PI Else ' x == 0 If y > 0 Then Return Math.PI ElseIf y < 0 Then Return -Math.PI Else ' if (y == 0) theta is undefined Return 0.0 End If End If End Function ' Computes Angle between current direction ' (vector from last vertex to current vertex) ' and the last pline segment Public Shared Function ComputeAngle(ByVal startPoint As Point3d, ByVal endPoint As Point3d, ByVal xdir As Vector3d, ByVal ucs As Matrix3d) As Double Dim v As New Vector3d((endPoint.X - startPoint.X) / 2, (endPoint.Y - startPoint.Y) / 2, (endPoint.Z - startPoint.Z) / 2) Dim cos As Double = v.DotProduct(xdir) Dim sin As Double = v.DotProduct(Vector3d.ZAxis.TransformBy(ucs).CrossProduct(xdir)) Return Atan(sin, cos) End Function #End Region #Region "Propriétés" ''' ''' La polyligne du Jig ''' ''' Renvoie Nothing si l'opération a été annulée Public Overloads ReadOnly Property Entity() As Entity Get If MyBase.Entity.IsDisposed Then Return Nothing Return MyBase.Entity End Get End Property ''' ''' Autorise les arcs dans le Jig ''' Public WriteOnly Property allowArc() As Boolean Set(ByVal value As Boolean) _allowArc = value End Set End Property ''' ''' Le click droit valide et ferme la polyligne par un segment droit ''' Public WriteOnly Property RigthClickClose() As Boolean Set(ByVal value As Boolean) _RigthClickClose = value End Set End Property #End Region End Class
-
Salut l'ami. Je te propose cette classe.Bon je te l'accorde ya un peu de ménage a faire dans le code ( genre des commentaires inutiles et des commentaires utile qui sont absent! ) Maintenant,si tu as aucune notion dans le langage ce code risque d'etre un peu compliqué,analyse un peu ce qu'il fait,et si besoin demande des précisions. La code est en managé: ''' ''' Class permettant de créer une polyligne en intégrant les arcs ''' ''' Source : http://through-the-interface.typepad.com/through_the_interface/2010/12/jigging-an-autocad-polyline-with-arc-segments-using-net.html Public Class BulgePolyJig Inherits EntityJig #Region "Déclaration interne" Private _tempPoint As Point3d = Nothing Private _plane As Plane = Nothing Private _isArcSeg As Boolean = False Private _isUndoing As Boolean = False Private _isClosed As Boolean = False Private _allowArc As Boolean = False Private _RigthClickClose As Boolean = False Private _ucs As Matrix3d = Nothing Private _MiddlePoint As Point3d = Nothing #End Region Private mLineTypeId As ObjectId = GetLineTypeIdFromLineTypeName("CACHE") ''' ''' Constructeur ''' ''' SCU dans lequel faire les calculs ''' Type de ligne Public Sub New(ByVal ucs As Matrix3d, ByVal LineTypeName As String) MyBase.New(New Polyline) Dim pline As Polyline = Nothing Dim normal As Vector3d = Nothing Try mLineTypeId = GetLineTypeIdFromLineTypeName(LineTypeName) _ucs = ucs normal = Vector3d.ZAxis.TransformBy(ucs) _plane = New Plane(Point3d.Origin, normal) pline = TryCast(Me.Entity, Polyline) pline.SetDatabaseDefaults() pline.Normal = normal AddDummyVertex() Catch ex As Exception Throw ex End Try End Sub ''' ''' Constructeur ''' ''' Type de ligne ''' Le scu utilisé pour les calculs est le scu courant. Sub New(Optional ByVal LineTypeName As String = "") MyBase.New(New Polyline) Dim pline As Polyline = Nothing Dim normal As Vector3d = Nothing Try If LineTypeName.Trim <> "" Then mLineTypeId = GetLineTypeIdFromLineTypeName(LineTypeName) _ucs = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem normal = Vector3d.ZAxis.TransformBy(_ucs) _plane = New Plane(Point3d.Origin, normal) pline = TryCast(Me.Entity, Polyline) pline.SetDatabaseDefaults() pline.Normal = normal AddDummyVertex() Catch ex As Exception Throw ex End Try End Sub ''' ''' Récupérer l'objetID d'un type de ligne à partir de son nom ''' ''' Nom du type de ligne ''' ObjectId du type de ligne Protected Function GetLineTypeIdFromLineTypeName(ByVal TypeName As String) As ObjectId Dim db As Database = Nothing Dim tm As DBTransMan = Nothing Dim tr As Transaction = Nothing Dim bt As LinetypeTable = Nothing 'gestion de la transaction Try db = HostApplicationServices.WorkingDatabase tm = db.TransactionManager tr = tm.StartTransaction bt = CType(tm.GetObject(db.LinetypeTableId, OpenMode.ForRead, False), LinetypeTable) Return bt.Item(TypeName) ''Dim btr As LinetypeTableRecord = CType(tm.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite, False), LinetypeTableRecord) Catch Return Nothing Finally If Not tr Is Nothing Then tr.abort() : tr.dispose() End Try End Function Protected Overrides Function Sampler(ByVal prompts As JigPrompts) As SamplerStatus Dim jigOpts As New JigPromptPointOptions() Dim pline As Polyline = Nothing Dim msgAndKwds As String = "" Dim kwds As String = "" Dim res As PromptPointResult = Nothing Try jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates Or UserInputControls.NullResponseAccepted Or UserInputControls.NoNegativeResponseAccepted) _isUndoing = False pline = TryCast(Me.Entity, Polyline) If pline.NumberOfVertices = 1 Then ' For the first vertex, just ask for the point jigOpts.Message = vbLf & "Sélectionner le point de départ :" ElseIf pline.NumberOfVertices > 1 Then If _isArcSeg Then If _MiddlePoint.X = 0 AndAlso _MiddlePoint.Y = 0 AndAlso _MiddlePoint.Z = 0 Then msgAndKwds = "Sélectionner le point se trouvant sur l'arc ou [undo]: " kwds = "Undo" Else msgAndKwds = "Sélectionner le point d'arrivé de l'arc ou [Line/Undo/Clore]: " kwds = "Line Undo Clore" End If Else If _allowArc Then msgAndKwds = vbLf & "Sélectionner le point suivant ou [Arc/Undo/Clore]: " kwds = "Arc Undo Clore" Else msgAndKwds = vbLf & "Sélectionner le point suivant ou [undo/Clore]: " kwds = "Undo Clore" End If End If jigOpts.SetMessageAndKeywords(msgAndKwds, kwds) Else Return SamplerStatus.Cancel End If ' Should never happen ' Get the point itself res = prompts.AcquirePoint(jigOpts) If res.Status = PromptStatus.Keyword Then If res.StringResult.ToUpper() = "ARC" Then _isArcSeg = True ElseIf res.StringResult.ToUpper() = "LINE" Then _isArcSeg = False ElseIf res.StringResult.ToUpper() = "UNDO" Then _isUndoing = True _isArcSeg = False ElseIf res.StringResult.ToUpper() = "CLORE" Then _isClosed = True Else MsgBox("Error") End If Return SamplerStatus.OK ElseIf res.Status = PromptStatus.OK Then ' Check if it has changed or not (reduces flicker) If _tempPoint = res.Value Then Return SamplerStatus.NoChange Else _tempPoint = res.Value Return SamplerStatus.OK End If ElseIf res.Status = PromptStatus.None Then If pline.NumberOfVertices <= 1 Then Return SamplerStatus.Cancel End If If _RigthClickClose Then _isClosed = True End If Return SamplerStatus.OK End If Return SamplerStatus.Cancel Catch ex As Exception Throw ex End Try End Function ''' ''' Fonction de mise a jour du jig ''' Protected Overrides Function Update() As Boolean Dim pl As Polyline = Nothing Dim refDir As Vector3d = Nothing Dim lastVertex As Point3d = Nothing, pt As Point3d = Nothing Dim arcSegment As CircularArc3d = Nothing Dim tangent As Line3d = Nothing Dim angle As Double = 0, bulge As Double = 0 Try ' Update the dummy vertex to be our 3D point ' projected onto our plane pl = TryCast(Me.Entity, Polyline) If _isArcSeg Then 'Si le point du milieu n'est pas défini en mode arc,alors l'utilisateur doit cliquer un point de l'arc If _MiddlePoint.X = 0 AndAlso _MiddlePoint.Y = 0 AndAlso _MiddlePoint.Z = 0 Then pl.SetBulgeAt(pl.NumberOfVertices - 2, 0) Else 'Le point du milieu est défini,alors on dessine l'arc passant par le point du milieu lastVertex = pl.GetPoint3dAt(pl.NumberOfVertices - 2) If pl.NumberOfVertices < 3 Then refDir = New Vector3d(1.0, 1.0, 0.0) pt = pl.GetPoint3dAt(pl.NumberOfVertices - 2) refDir = New Vector3d(_MiddlePoint.X - pt.X, _MiddlePoint.Y - pt.Y, _MiddlePoint.Z - pt.Z) Else ' Check bulge to see if last segment was an arc or a line If pl.GetBulgeAt(pl.NumberOfVertices - 3) <> 0 Then arcSegment = pl.GetArcSegmentAt(pl.NumberOfVertices - 3) tangent = arcSegment.GetTangent(lastVertex) ' Reference direction is the invert of the arc tangent ' at last vertex refDir = tangent.Direction.MultiplyBy(-1.0) Else pt = pl.GetPoint3dAt(pl.NumberOfVertices - 2) refDir = New Vector3d(_MiddlePoint.X - pt.X, _MiddlePoint.Y - pt.Y, _MiddlePoint.Z - pt.Z) End If End If angle = ComputeAngle(_MiddlePoint, _tempPoint, refDir, _ucs) ' Bulge is defined as tan of one fourth of included angle ' Need to double the angle since it represents the included ' angle of the arc ' So formula is: bulge = Tan(angle * 2 * 0.25) bulge = Math.Tan(angle * 0.5) pl.SetBulgeAt(pl.NumberOfVertices - 2, bulge) End If Else 'en mode LINE,on remet a vide le point du milieu _MiddlePoint = Nothing ' Line mode. Need to remove last bulge if there was one If pl.NumberOfVertices > 1 Then pl.SetBulgeAt(pl.NumberOfVertices - 2, 0) End If End If pl.SetPointAt(pl.NumberOfVertices - 1, _tempPoint.Convert2d(_plane)) Return True Catch ex As Exception Return False End Try End Function #Region "Partie Publique" ''' ''' Permet de saisir une polyligne dans autocad ''' Public Sub Draw() Dim ed As Editor = Nothing Dim jig As BulgePolyJig = Nothing Dim res As PromptResult = Nothing Try ed = Application.DocumentManager.MdiActiveDocument.Editor While True res = ed.Drag(Me) Select Case res.Status ' New point was added, keep going Case PromptStatus.OK AddDummyVertex() Exit Select ' Keyword was entered Case PromptStatus.Keyword If _isUndoing Then RemoveLastVertex() End If If _isClosed Then ClosePolyline() Exit While End If Exit Select ' If the jig completed successfully, add the polyline Case PromptStatus.None If _isClosed Then ClosePolyline() Else RemoveLastVertex() End If Exit While Case Else ' User cancelled the command, get out of here ' and don't forget to dispose the jigged entity Me.Entity.Dispose() Exit While End Select End While Catch ex As Exception Throw ex End Try End Sub ''' ''' Ajoute un point nul a la polyligne ''' ''' Aucune idée de pourquoi Public Sub AddDummyVertex() Dim pline As Polyline = Nothing Try pline = TryCast(Me.Entity, Polyline) If _isClosed Then Return ' Create a new dummy vertex... can have any initial value 'On est sur un arc If _isArcSeg Then 'Si le point milieu est vide alors on affecte le dernier point en tant que point milieu If _MiddlePoint.X = 0 AndAlso _MiddlePoint.Y = 0 AndAlso _MiddlePoint.Z = 0 Then _MiddlePoint = pline.GetPoint3dAt(pline.NumberOfVertices - 1) Else pline.AddVertexAt(pline.NumberOfVertices, New Point2d(0, 0), 0, 0, 0) _isArcSeg = False End If Else pline.AddVertexAt(pline.NumberOfVertices, New Point2d(0, 0), 0, 0, 0) End If Catch ex As Exception Throw ex End Try End Sub ''' ''' Supprime le dernier sommet de la polyligne ''' Public Sub RemoveLastVertex() Dim pline As Polyline = Nothing Dim blg As Double = 0 Try pline = TryCast(Me.Entity, Polyline) ' Let's first remove our dummy vertex If pline.NumberOfVertices <= 1 Then Entity.Dispose() Exit Sub End If ' And then check the type of the last segment If pline.NumberOfVertices >= 2 Then blg = pline.GetBulgeAt(pline.NumberOfVertices - 2) pline.RemoveVertexAt(pline.NumberOfVertices - 1) _isArcSeg = (blg <> 0) End If Catch ex As Exception Throw ex End Try End Sub ''' ''' Ferme la polyligne ''' ''' Prends en compte si le dernier segment est une ligne ou un arc Public Sub ClosePolyline() Dim pline As Polyline = Nothing Dim blg As Double = 0 Dim pt As Point3d, lastVertex As Point3d Dim refDir As Vector3d Dim angle As Double, bulge As Double Try pline = TryCast(Me.Entity, Polyline) If _isArcSeg Then lastVertex = pline.GetPoint3dAt(pline.NumberOfVertices - 2) ' Check bulge to see if last segment was an arc or a line If pline.GetBulgeAt(pline.NumberOfVertices - 3) <> 0 Then refDir = pline.GetArcSegmentAt(pline.NumberOfVertices - 3).GetTangent(lastVertex).Direction.MultiplyBy(-1.0) Else pt = pline.GetPoint3dAt(pline.NumberOfVertices - 2) refDir = New Vector3d(_MiddlePoint.X - pt.X, _MiddlePoint.Y - pt.Y, _MiddlePoint.Z - pt.Z) End If angle = ComputeAngle(_MiddlePoint, pline.GetPoint3dAt(0), refDir, _ucs) ' Bulge is defined as tan of one fourth of included angle ' Need to double the angle since it represents the included ' angle of the arc ' So formula is: bulge = Tan(angle * 2 * 0.25) bulge = Math.Tan(angle * 0.5) pline.SetBulgeAt(pline.NumberOfVertices - 2, bulge) End If 'Le dernier point correspond toujours au point temporaire de la position de la souris pline.RemoveVertexAt(pline.NumberOfVertices - 1) pline.Closed = True : _isClosed = True Catch ex As Exception Throw ex End Try End Sub ''' ''' Ajoute la polyligne au ModelSpace ''' Public Sub Append() Dim bt As BlockTable = Nothing Dim btr As BlockTableRecord = Nothing Try Using tr As Transaction = HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction bt = TryCast(tr.GetObject(HostApplicationServices.WorkingDatabase.BlockTableId, OpenMode.ForRead), BlockTable) btr = TryCast(tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord) btr.AppendEntity(Me.Entity) tr.AddNewlyCreatedDBObject(Me.Entity, True) tr.Commit() End Using Catch ex As Exception Throw ex End Try End Sub ' Custom ArcTangent method, as the Math.Atan ' doesn't handle specific cases Public Shared Function Atan(ByVal y As Double, ByVal x As Double) As Double If x > 0 Then Return Math.Atan(y / x) ElseIf x < 0 Then Return Math.Atan(y / x) - Math.PI Else ' x == 0 If y > 0 Then Return Math.PI ElseIf y < 0 Then Return -Math.PI Else ' if (y == 0) theta is undefined Return 0.0 End If End If End Function ' Computes Angle between current direction ' (vector from last vertex to current vertex) ' and the last pline segment Public Shared Function ComputeAngle(ByVal startPoint As Point3d, ByVal endPoint As Point3d, ByVal xdir As Vector3d, ByVal ucs As Matrix3d) As Double Dim v As New Vector3d((endPoint.X - startPoint.X) / 2, (endPoint.Y - startPoint.Y) / 2, (endPoint.Z - startPoint.Z) / 2) Dim cos As Double = v.DotProduct(xdir) Dim sin As Double = v.DotProduct(Vector3d.ZAxis.TransformBy(ucs).CrossProduct(xdir)) Return Atan(sin, cos) End Function #End Region #Region "Propriétés" ''' ''' La polyligne du Jig ''' ''' Renvoie Nothing si l'opération a été annulée Public Overloads ReadOnly Property Entity() As Entity Get If MyBase.Entity.IsDisposed Then Return Nothing Return MyBase.Entity End Get End Property ''' ''' Autorise les arcs dans le Jig ''' Public WriteOnly Property allowArc() As Boolean Set(ByVal value As Boolean) _allowArc = value End Set End Property ''' ''' Le click droit valide et ferme la polyligne par un segment droit ''' Public WriteOnly Property RigthClickClose() As Boolean Set(ByVal value As Boolean) _RigthClickClose = value End Set End Property #End Region End Class
-
Je vais tester ton approche .. en revanche,pour l'explosion de la région je te conseillerai plutot le code suivant ( désolé je ne suis pas expert C#,ce sera du vb ... ) Dim sbep As SubentityId Dim ids As ObjectId() Dim OutsidePath As FullSubentityPath Dim lenti As Entity Dim CurrentRegion As Region Dim comptent As Integer = 1 Dim EntitiesInRegionToConvert As New DBObjectCollection Dim EntitiesFromExplodeRegion As New DBObjectCollection 'On commence a 1 sinon on obtient systématiquement Nothing a la position 0 While True Try ids = New ObjectId(0) {} 'indiquer le type de l'entité que l'on souhaite récupérer sbep = New SubentityId(SubentityType.Face, comptent) OutsidePath = New FullSubentityPath(ids, sbep) 'Récupérer l'entité au conpteur indiquer lenti = RegionToConvert.GetSubentity(OutsidePath) 'si on obtient Nothing c'est qu'on a plus rien a récupérer,donc on sort du while pour reprendre le cours 'normal du traitement If lenti Is Nothing Then Exit While EntitiesInRegionToConvert.Add(lenti) Catch tr.Dispose() : tr = Nothing Return False End Try comptent += 1 End While For i As Integer = 0 To EntitiesInRegionToConvert.Count - 1 System.Windows.Forms.Application.DoEvents() 'Récupétation de la région courante CurrentRegion = CType(EntitiesInRegionToConvert.Item(i), Region) While True Try ids = New ObjectId(0) {} 'indiquer le type de l'entité que l'on souhaite récupérer sbep = New SubentityId(SubentityType.Edge, comptent) OutsidePath = New FullSubentityPath(ids, sbep) 'Récupérer l'entité au conpteur indiquer lenti = CurrentRegion.GetSubentity(OutsidePath) 'si on obtient Nothing c'est qu'on a plus rien a récupérer,donc on sort du while pour reprendre le cours 'normal du traitement If lenti Is Nothing Then Exit While EntitiesFromExplodeRegion.Add(lenti) Catch tr.Dispose() : tr = Nothing Return False End Try comptent += 1 End While CurrentRegion.Dispose() : CurrentRegion = Nothing Next i EntitiesInRegionToConvert.Dispose() : EntitiesInRegionToConvert = Nothing Code testé et fonctionnel là ou d'autre pouvais produire des erreurs notament sur autocad 2009 ...
-
Oui giles,j'étais parti sur cette solution au départ. Sa marche niquel du moment que tu n'a pas de boucle interne. A partir du moment ou ya une boucle interne sa se complique.Ou alors a partir du moment ou les deux contour de polyligne se coupent en formant du coup des contour indépendant ... Vaste problème que celui de la création de région. J'ai cherché un algorythme permettant de me dégager des régions pour bosser directement avec des points,sans succès réel ( a savoir,sa ne marche que dans les cas simple! ) Concernant mes soucis de région,je suis sur autocad 2009,le problème en question a peut etre été corrigé dans les versions ultérieures ... mais je peux te garantir qu'en créant une région avec une liste de point2D,on peut obtenir des régions bizaroides ...
-
Je te remercie giles pour ce code,ça ne réponds pas a mon besoin mais je te remercie de la peine que tu t'es donné. J'étais a l'origine partie de graham'scan pour obtenir l'enveloppe convexe.Puis de cette enveloppe convexe j'intégré une partie des points du contour des polyligne de départ au contour final. Cela fonctionnait pas mal,mais j'étais bloqué au moment ou il fallait trouver le meilleure point de raccord diront nous entre les deux polylignes de départ ... En fait,mon besoin c'est un algorythme de calcul d'enveloppe concave,et non convexe ... et les concavité,c'est la que ça coince ! PS: je vois que tu tattes un peu le F#,quel est l'interet de faire du F# plutot que du vb.net ( que je pratique ,ou encore du C# que j'aimerais bien pratiquer mais que je n'ai pas le temps de le faire sur mon lieux de travail! ) PPS: d'ailleurs en regardant un peu la syntaxe du F# j'ai l'impression de voir un peu du vba notament avec les 'let' qui je pense était les 'set' en vba pour affectuer une variable de type objet ... [Edité le 15/4/2011 par bazoul]
-
Conversion AutoCAD/Visio
bazoul a répondu à un(e) sujet de bazoul dans Suggestions de développements
Hey hey ! je me suis déja interessé a la partie DWG => VSD.Le temps de traitement est pas des plus rapide vu que j'utilise les méthodes interop disponible avec visio. Le temp developpement pur n'a pas été très long en soit ( 24H non-stop pour obtenir un premier résultat satisfaisant.La phase d'optimisation des performances à été elle plus longue vu que je voulais respecter l'ordre d'affichage!) Le temps de traitement est encore un peu long : 1H15 pour traiter 30.000 entités graphiques dont la majeure partie sont des blocs ainsi que 800Mo de ram consommée ... ya peut etre un moyen plus performant mais plus contraignant à envisager ... Je me disais bien qu'il serait interessant de faire également la manipulation inverse. La manipulation inverse est possible directement via visio.Seulement le résultat n'est pas des plus optimal ( perte des hachures ou autre ),conversion une page = un fichier dwg .. Avant de me lancer dans quoi que ce soit,j'aurais besoin d'un peu plus d'infos : -Version autocad (moi j'ai fais sa sur 2011) -Version de visio ( moi sur visio 2003) -Fonctionnement souhaité (une page = un fichier ou un fichier visio = un fichier autocad alros le contenue décalé d'une certaine distance ... ) -Les éléments a retranscrire ( table de correspondance des hachures,des types de ligne,les objet a converser du genre 1groupe=un bloc ...) Cordialement, -
Mesdames,Messieurs, Voila alors je me demande si certain d'entre nous auraient besoin de convertir des fichiers dwg en fichier visio? Mais attention,je ne parle pas de simplement importer un dwg en tant qu'un groupe mais plutôt d'obtenir un vrai fichier VSD avec de vrai entité .... Y a t-il un besoin dans d'autre type de conversion? Cordialement,
-
Bonjours, Alors voila j'ai un petit soucis que je n'ai toujours pas réussi a résoudre,j'explique : J'ai en entré N polyligne fermée. Ces polylignes s'intersectent. Ce que je voudrais,c'est un algo qui a partir de deux polylignes en entré retourne une seule polyligne en sortie. Le must serait de ne travailler qu'avec un nuage de point,mais malgrès mes recherches et l'élaboration d'un algo basé sur Graham'scan je ne suis pas parvenue a grand chose ... Au jour d'aujourd'hui,je me débrouille comme je peux en passant par des régions et des opérations booléeennes, mais ce n'est pas le top.Des problèmes peuvent survenir à la suite de bug autocad ( exemple;après l'union de deux régions autocad peux nous sortir une région résultante qui n'est pas planaire!! ) et qui rendent la fonction explode non fonctionnelle.Du moment où cette région résultante n'est plus planaire,toutes les opérations booléenne derrière donneront une région résultante pourrie. Dans la continuité de la problématique précédente ( un algo qui me donnerait le meme résultat qu'avec les régions ) j'ai un autre problème mais cette fois ci avec des hachure : Grosso,l'utilisateur dessine une polyligne dans laquelle vont se trouver des parcelles ( polyligne ). Une fois que l'utilisateur a terminé le tracé de la polyligne,je récupère le contenu et hachure la zone.Puis via une petite interface il peux décocher les zones a ne pas hachurer ... là ou je coince,c'est lorsque la hachure a créer possède deux boucles externe on va dire ... en fonction de la géométrie,autocad me rajoute des points a mon contour,et je me retrouve avec des segments de longueur 0 .... derrière la hachure merde et ne prends pas en compte le contour incriminé. Pour terminerai par,merci à ceux qui vont prendre le temps de lire mon pavé,je bosse en VB.NET sur autocad 2009 et que je suis ouvert a répondre a toutes questions. Cordialement, PS: image explicative du premier problème http://www.hebergeur-images.fr/images/1250423745.jpg [Edité le 15/4/2011 par bazoul]
-
pourquoi pas une petite routine vba qui décompose ton bloc et qui regarde le contenue explosé ... si il reste des blocs dans le contenue,alors il les décompose et ainsi de suite ....
-
Salut, Je suis un peu en retard mais .. Déja tu es pas dans la bonne rubrique,ce qui explique peut etre la non réponse a ta question. Ensuite pour les tutos,je ne sais pas. Visual studio crée des .dll ... ces dll sont a charger dans AutoCAD via la commande NETLOAD a chaque ouverture de session autocad. Un DLL se charge pour la session et ne se décharge pas. Tu peux éventuellement charger tes dll automatiquement via un lisp .... Concernant le passage de vba a vb.net .... le concept des deux language est différent et l'approche aussi .... Alors pour ta demande,selon moi : -Créer un projet de type library dans visual studio. -Ajouter les références COM a AutoCAD dans ton projet ( AutoCAD Type Library et Autocad/objectdbx common ) -Ajouter les dll acmgd et acdbmgd qui se trouve dans le répertoire d'installation d'autocad -Ajouter ton code dans ta classe. De base,sans trop te prendre la tete,tu fais un simple copier coller de ton code vba dans vb.net et sa devrait pas trop mal se passer ... Maintenant,je te conseillerai plutot de migrer le code correctement plutot que de faire ce que je cite ci dessus. Cordialement,
-
Du temp pour développer mais pas d\'idée !
bazoul a répondu à un(e) sujet de bazoul dans Suggestions de développements
J'ai pris connaissance de ton post. Le probleme ne me parait pas simple,ya des paramètres a prendre en compte telque le type de ligne variant,l'épaisseur,la tolérance graphique ... Je vais réfléchir a la question et voir ce qui peux en sortir. Je ne promet rien,mais je reviens vers toi pour éventuellement une première ébauche. -
Du temp pour développer mais pas d\'idée !
bazoul a posté un sujet dans Suggestions de développements
Salut a vous tous, Voila,j'ai du temps,envie de faire un petit dev mais pas d'idée .. Quequ'y serait utile pour vous les gens du BE ou autre? Sur une base Autocad si possible sinon on en discute ^^ A bientot -
Recherche dessinateur/développeur Autocad
bazoul a répondu à un(e) sujet de aresidati dans Emploi, monde du travail
Serait possible également d'avoir un mail où te contacter? -
Recherche dessinateur/développeur Autocad
bazoul a répondu à un(e) sujet de aresidati dans Emploi, monde du travail
En plus des précisions demandé par lili2006 serait il possible de préciser l'emplacement de la société? -
Je n'apporte pas de réponse a ta question mais une suggestion : Il semblerait que tu taquine un ptit peu autocad avec la méthode ReadDwg ... et moi aussi en ce moment. Peut etre pourrions nous centraliser nos demandes dans un seule et meme post .... PS : je n'ai pas trouvé comment envoyer ce message en MP ....
-
création acad.exe et process
bazoul a répondu à un(e) sujet de bazoul dans ObjectARX/DBX, C++, .NET, RealDWG
En effet,je détails un peu plus : AU début je me suis contenté de lire la base de données d'un dwg. Ensuite,j'ai ajouté des entités simple dans la base de données d'un DWG non ouvert physiquement. Puis,j'ai ajouté mes CustomObjet créées depuis un dessin DWG ouvert physiquement dans la base de données d'un DWG non ouvert physiquement. Dernière étape,je veux maintenant ajouter mes CustomObjet créés en mémoire dans une DataBase neuve dans le but de créer un nouveau DWG. Mes CustomObjet sont justement créés en ARX.J'utilise mon programme .NET l'ARX pour créer en CustomObjet. Je n'utilise que mes CustomObjet dans mon dessin DWG. Mon but ultime serait de réussir à créer mon DWG,avec des données bien défini ( par exemple 1CustomObjet inséré en X=10,Y=15 ) en partant de rien.Juste partir d'une DataBase vide,et générer un DWG. Voila voila,j'avoue que la compréhension du post n'est pas forcément évidente vu que j'ai avancé par étape .... -
création acad.exe et process
bazoul a répondu à un(e) sujet de bazoul dans ObjectARX/DBX, C++, .NET, RealDWG
Alors je confirme que mon CustomObject hérite bien de Entity. Son type est un type que j'ai défini,d'où le coté Custom ! Mon code ressemble bien a ton exemple de code avec la Sub "test". La seule différence est bien entendu que je n'ajoute pas un objet "Circle" mais un Objet de type "CustomObject" ... Il faut bien garder à l'esprit que je crée une nouvelle DataBase dans le but de créer un nouveau fichier DWG sans l'ouvrir ... Vu que le reste de mon code est en managé j'aurais voulu rester en managé et ne pas panaché avec de l'interop ... Je vais continuer a chercher,ya pas 50.000 méthode utilisé,je vais bien finir par trouver ... a moins que le problème vienne directement de la définition de mon CustomObject comme tu le suggère ... auquel cas,ya pas grand chose a faire d'un point de vu code autodesk. -
création acad.exe et process
bazoul a répondu à un(e) sujet de bazoul dans ObjectARX/DBX, C++, .NET, RealDWG
Je te remercie de ces indications, Je persiste dans mon idée,qui n'a plus rien a voir avec le sujet initial certe mais,il semblerait que bien que l'on puisse insérer des éléments dans un dwg fermé,de toute évidence on ne pourrait pas ajouter des éléments personnalisé. Je m'explique en interop on a: ThisDrawing.ModelSpace.AddCustomObject(monObjetPerso) En managé,tentative avec : 'Récupération du bloc représentant le ModelSpace btr = CType(tr.TransactionManager.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite, False), BlockTableRecord) btr.AppendEntity(MyCustomObject) tr.AddNewlyCreatedDBObject(MyCustomObject, True) Sauf que lorsque j'éssai de sauvegarder la DataBase,que ce soit avec la méthode Save() ou SaveAs() .. bin c'est le drame,soit une méchante erreur,soit un message d'erreur ... La ou je ne comprends pas,c'est que meme si on crée une nouvelle DataBase représentative du fichier que l'on veux créer,il faut bien enregistrer a un moment ou a un autre un fichier dwg représentatif de la base de donnée non? -
création acad.exe et process
bazoul a répondu à un(e) sujet de bazoul dans ObjectARX/DBX, C++, .NET, RealDWG
Ok alors l'ajout d'entité autocad dans un dwg sans l'ouvrir,d'après ce que j'ai fait sa donne ça : Dim mdatabase As Database Dim mDbObject As DBObject Dim bt As BlockTable = Nothing Dim btr As BlockTableRecord = Nothing Dim iter As BlockTableRecordEnumerator Dim IsOnLockLayer As Boolean mdatabase = New Database(False, True) mdatabase.ReadDwgFile(FileToRead, IO.FileShare.ReadWrite, True, "") Using tr As Transaction = mdatabase.TransactionManager.StartTransaction 'Récupération de la table des blocs bt = CType(tr.TransactionManager.GetObject(mdatabase.BlockTableId, OpenMode.ForWrite, False), BlockTable) 'Récupération du bloc représentant le ModelSpace btr = CType(tr.TransactionManager.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite, False), BlockTableRecord) iter = btr.GetEnumerator While iter.MoveNext Try IsOnLockLayer = False mDbObject = tr.GetObject(iter.Current, OpenMode.ForWrite, False, False) Catch ex As Exception 'Si calque verrouillé,alors on ne peux pas ouvrir en écriture IsOnLockLayer = True mDbObject = tr.GetObject(iter.Current, OpenMode.ForRead, False, False) End Try If mDbObject.GetType Is GetType(Polyline) Then mpo = CType(CType(mDbObject, Polyline).Clone, Polyline) mpo.ColorIndex = 4 'Ajout de l'objet dans une liste pour ajout dans le fichier mListOfEntityToAdd.Add(mpo) End If End While 'Ajout physique de tous les objets dans le ModelSpace For Each mentity As Entity In mListOfEntityToAdd Try btr.AppendEntity(mentity) tr.AddNewlyCreatedDBObject(mentity, True) Catch ex As Exception End Try Next mentity 'Enregeistrement de la DataBase mdatabase.SaveAs(mdatabase.Filename, mdatabase.OriginalFileVersion) End Using Le seul problème que j'ai pu rencontrer c'est qu'un problème survienne durant le traitement en entrainant une base corrompu,résulat le fichier Dwg était mort,donc perte d'information. Pour contourner cela,un simple back-up suffit. Si quelqu'un voit quelquechose de mieux a faire dans mon code,remarque ou autre,je suis preneur ! Je suis toujours a la recherche d'une fonction générique me permettant de "filtrer" les entitées du ModelSpace ... du genre tanto je veux récupérer toutes les entités sur le calque 0 et tanto toutes les entitées contenues sur le calque 0 et de type de ligne = CACHE par exemple ... [Edité le 8/7/2010 par bazoul] -
création acad.exe et process
bazoul a répondu à un(e) sujet de bazoul dans ObjectARX/DBX, C++, .NET, RealDWG
Ok ok,donc du coup faut parcourir toutes les entités,faire le test pour savoir si elle repondent au filtre qu'on aurait utilisé ... je vais y voir sa ^^ EDIT Ok donc en effet parcourir le contenues du modelspace n'est pas si long que cela en ne visant que les éléments contenue sur le calque 0 par exemple. Sauf que si maintenant je veux faire une fonction générique qui prends en entré un nom de fichier + un filtre,il faut se palucher tous les cas de figure possible et inimaginable,et avec tous les cas de test possible on est pas sortie ! Je vais voir ça ce soir ou demain soir pour voir ce que je peux faire [Edité le 5/7/2010 par bazoul] -
création acad.exe et process
bazoul a répondu à un(e) sujet de bazoul dans ObjectARX/DBX, C++, .NET, RealDWG
Hey giles, Bon alors aprés un bon moment d'oubliettes me revoici sur le sujet de sélection d'entité via la database. J'ai jetté un oeil mais a part parcourir le block ModelSpace je n'ai pas trouvé comment faire. Suis je dans l'erreur de penser qu'il faille parcourir le contenu du block modelspace ou alors ya til un moyen de filtrer les éléments que l'on souhaite d'une quelque maniere que ce soit?
