Aller au contenu

Aide sur programme en Dotnet ?


tamu

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

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 modeleur
  • En 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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité