tamu Posté(e) le 11 août 2015 Posté(e) le 11 août 2015 Bonjour Voici un bout de code : Public Sub CreateRegionsForAll() CommandLine.CommandC("_.REGION", "_ALL", "") End Sub J ai 1000 ou 10000 ou 100000 lignes parfaitement connectées (representant du cadastre) et donc tout se passe bien !MAIS la commande REGION est très lente ! Y a t il un moyen d aller beaucoup plus vite pour générer les polygones clos ? Merci d avance, Tamu
(gile) Posté(e) le 11 août 2015 Posté(e) le 11 août 2015 Salut, Personnellement, je ne connais pas cette classe "CommandLine", ni sa méthode statique CommandC(). Dans tous les cas :Le temps de traitement augmentera considérablement plus que le nombre de ligne (grossièrement, pour chaque ligne, il faut comparer les points de départ et de fin avec ceux de toutes les autres)La création de régions (comme de solides) demande toujours un temps de latence la première fois dans la session à cause du chargement des DLLs de modeleurEn programmation, appeler les commandes AutoCAD est généralement plus long que que de coder le processus. tu peux essayer avec le code ci-dessous, mais le gain ne sera pas forcément sensible. public void CreateRegionForAll() { var db = HostApplicationServices.WorkingDatabase; var curveClass = RXClass.GetClass(typeof(Curve)); using (var tr = db.TransactionManager.StartTransaction()) { var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); var curves = new DBObjectCollection(); foreach (ObjectId id in curSpace) { if (id.ObjectClass.IsDerivedFrom(curveClass)) { var curve = (Curve)tr.GetObject(id, OpenMode.ForRead); curves.Add(curve); } } foreach (DBObject dbObj in Region.CreateFromCurves(curves)) { var region = (Region)dbObj; curSpace.AppendEntity(region); tr.AddNewlyCreatedDBObject(region, true); } tr.Commit(); } } Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
tamu Posté(e) le 14 août 2015 Auteur Posté(e) le 14 août 2015 Bonjour Gile, Un grand merci pour ton aide ! La formule est magnifiquement efficacement ! Le test est positif dans un dessin contenant uniquement un seul calque a traiter. Malheureusement j'obtient des erreurs de constructions (surface mal détectées) lorsque je travail sur un dessin avec de multiples calques (objets divers). J'ai filtré le calque concerné dans la boucle "foreach (ObjectId id in curSpace)" mais apparement cela ne suffit pas. As-tu une idée du problème ? Voici le code complété : (AutoCAD 2012 +) Try Dim db = HostApplicationServices.WorkingDatabase Dim curveClass = RXClass.GetClass(GetType(Curve)) Using tr = db.TransactionManager.StartTransaction() Dim curSpace = DirectCast(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord) Dim curves = New DBObjectCollection() For Each id As ObjectId In curSpace If id.ObjectClass.IsDerivedFrom(curveClass) Then Dim curve = DirectCast(tr.GetObject(id, OpenMode.ForRead), Curve) If curve.Layer = LayerName Then curves.Add(curve) End If Next If curves.Count <> 0 Then For Each dbObj As DBObject In Region.CreateFromCurves(curves) Dim region1 = DirectCast(dbObj, Region) region1.SetDatabaseDefaults() curSpace.AppendEntity(region1) tr.AddNewlyCreatedDBObject(region1, True) Next End If tr.Commit() End Using Catch ex As Exception MsgBox("CreateRegionsForAll : " & ex.Message) End Try
(gile) Posté(e) le 14 août 2015 Posté(e) le 14 août 2015 Salut, Je ne pense pas que ça puisse avoir à faire avec les calques.Le résultat n'est-il pas le même avec ce code et avec la commande REGION ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
tamu Posté(e) le 14 août 2015 Auteur Posté(e) le 14 août 2015 Merci pour ton feedback. Effectivement le résultat est différent entre les 2 techniques. Je cherche encore dans la direction du LockDocument & Co !
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant