PhilOctet Posté(e) le 11 juillet 2011 Posté(e) le 11 juillet 2011 Bonjour, J'élabore et débogue mes routines VB.Net avec VS2008 SP1 et un dessin test ouvert (format 2010) dans l'environnement AutoCAD 2011. Dès que je passe en mode ReadDwgFile, pour ne pas à avoir à les ouvrir graphiquement, les outils de modifications semblent avec ne plus fonctionner ? Ou plutôt si, mais les modifs ne sont pas prises en compte lors du Commit. En d'autres termes, lorsque j'ouvre le dessin graphiquement, je ne retrouve pas les modifications. 1/ Quels sont les limites d'un tel usage ?2/ Ou peut-on faire ce que l'on veut ? dessiner, modifier les tables et objets. Par exemple, je crois qu'il n'est pas possible de sélectionner avec les outils tels que GetSelection ou SelectAll, etc. Merci de votre aide.
(gile) Posté(e) le 11 juillet 2011 Posté(e) le 11 juillet 2011 Salut, Avec ReadDwgFile(), on accède à la base de donnée (Database) du dessin, mais on ne peut pas accéder à l'éditeur (Editor).Les méthodes de la classe Editor comme SelectAll() sont donc inaccessibles, il faut 'scanner' l'espace objet (et/ou les espaces papier) ce qui n'est guère plus couteux.Par contre toutes les méthodes de Database sont accessibles. Pour que les modifications soient prises en compte, il faut sauvegarder avec Database.SaveAs(). PS : une recherche dans ce forum avec ReadDwgFile t'aurais donné plusieurs résultats traitant de cette question (dont certaines aux quelles tu as participé)... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
PhilOctet Posté(e) le 13 juillet 2011 Auteur Posté(e) le 13 juillet 2011 Bonjour, Je pense que c'est avec la class AcDbObject que je vais pouvoir sélectionner les objets. Dans un 1er temps, j'aimerais sélectionner tous les objets. N'aurais-tu pas un p'tit bout de code à titre d'exemple ? Je sais explorer les tables de calques, blocs mais je crois que les objets (entity) sont gérés autrement. Puis-je également ne sélectionner qu'un type d'objet ? je t'en remercie.
(gile) Posté(e) le 13 juillet 2011 Posté(e) le 13 juillet 2011 Salut, Je pense que c'est avec la class AcDbObject que je vais pouvoir sélectionner les objets. Je ne connais pas de classe AcDbObject en .NET... L'espace objet, par exemple, est une instance de la classe BlockTableRecord. Cette classe implémente l'interface IEnumerable et peut donc être parcourue à l'aide foreach (For Each en VB) pour obtenir tous les ObjectId des entités qui la compose. Pour ne sélectionner qu'un type d'entité, il faut tester le type auquel correspond chaque ObjectId. Suivant la version avec laquelle tu travailles, il faut ouvrir l'objet dans une transaction en essayant de le convertir avec le mot clé as (ou TryCast en VB, je pense) dans le type recherché, si l'objet n'est pas null (Nothing en VB) c'est qu'il est bien du type recherché. Avec les versions plus récentes d'AutoCAD (2010 il me semble) la classe ObjectId a une nouvelle propriété ObjectClass qui retourne un objet RXClass qui a des propriétés Name ou DxfName permettant d'identifier le type d'entité sans avoir à l'ouvrir. Exemples d'une méthode qui retourne un ObjectIdCollection contenant les ObjectId de toutes les polylignes de l'espace objet d'une Database. En ouvrant chaque objet pour en déterminer le type : private ObjectIdCollection GetAllPolylineInModelSpace(Database db) { ObjectIdCollection result = new ObjectIdCollection(); using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[blockTableRecord.ModelSpace], OpenMode.ForRead); foreach (ObjectId id in btr) { Polyline pl = tr.GetObject(id, OpenMode.ForRead) as Polyline; if (pl != null) result.Add(id); } tr.Commit(); } return result; } Sans ouvrir chaque objet pour en déterminer le type (nécessite ObjectClass) : private ObjectIdCollection GetAllPolylineInModelSpace(Database db) { ObjectIdCollection result = new ObjectIdCollection(); using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[blockTableRecord.ModelSpace], OpenMode.ForRead); foreach (ObjectId id in btr) { if (id.ObjectClass.DxfName == "LWPOLYLINE") result.Add(id); } tr.Commit(); } return result; } Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
PhilOctet Posté(e) le 13 juillet 2011 Auteur Posté(e) le 13 juillet 2011 Merci. J'avais oublié que ModelSpace et PaperSpace étaient considérés comme des blocs. En regard du nombre d'objets présents dans certains dessins, je pense que la méthode "sans ouvrir" est plus rapide. Bon weekend,
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