Aller au contenu

Modification de dessins sans les ouvrir


PhilOctet

Messages recommandés

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

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é