Aller au contenu

Macro ou enregistreur d\'actions?


Messages recommandés

Posté(e)

Bonjour,

je vais essayer d'expliquer mon problème le plus clairement possible (c'est pas gagné)...

 

Voilà j'effectue avec des plans du cadastre récupérés sur internet et transformés en .dwg grâce à Adobe illustrator des manipulations qui se répètent d'un plan à un autre (explosion de blocs, transformation des couleurs de batiment, suppression de certaines lignes qui se superposent,....).

Enfin voilà la base...

 

J'ai essayé alors d'automatiser ces manip en vba sous autocad 2008 (j'ai utilisé ce language car je le connaissais un peu sous excel) mais j'avoue que je rame voir je coule....

 

Mais nous avons également Autocad 2010 qui permet apperemment d'enregistrer des actions (Outils->Enregistreur d'actions...) et cela fonctionne pas trop mal mais il n'enregistre que des actions faites au clavier...or j'utilise la commande "sélection rapide" ou SELECTRAP, je filtre alors mes différents paramètres avec la SOURIS et là cet enregistreur d'actions n'enregistre pas ces actions....lorsque je lance la lecture il m'ouvre la fenêtre de délection rapide et attend mes différents filtres...

 

J'espère que j'ai été + ou - claire.

 

Mes questions sont les suivantes:

 

Existes-t-il un moyen d'utliser SELECTRAP en indiquant nos filtres que par le clavier (qu'il n'ouvre pas la fenêtre "sélection rapide") du genre "Selctectrap->Dessin entier ->pline->epaisseur de ligne = 0"?

 

Existes-t-il une autre méthode pour arriver à mes fins?

 

Merci d'avance pour vos réponses....et longue vie à ce forum

Posté(e)

Salut,

 

il est possible de faire des sélections filtrées avec VBA (comme avec tous les langages supportés par AutoCAD : LISP, dotNET, ARX).

 

Cherche dans l'aide aux développeurs d'AutoCAD...

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Pourtant j'ai pas mal cherché durant toute la journée d'hier...

 

et en fait je bute sur la première étape:

 

comment sélectionner une polyligne, une hachure avec des propriétés définies pour ensuite les supprimer ou changer de couleur...

 

comment sélectionner tout un dessin et exploser les blocs qui sont présents...

 

en fait je bloque sur la sélection (en tout cas pour le début)....

 

Merci pour l'aide.

Posté(e)

Bonjour et encore merci

 

le projet avance mais j'ai enccore un souci:

 

Losque j'essaie de sélectionner des polylignes dans le dessin pour les supprimer, changer de couleur, etc,... je n'y arrive pas.

 

Je me suis rendu compte qu'en fait mes polylignes sont des polylignes 2D...J'ai trouvé un message de votre part le 14/03/2009 (lien: http://cadxp.cadmag.info/XForum+print-fid-93-tid-23093.html) qui explique cette différence.

 

Mon problème c'est comment traduire en vba : sélectionner toutes les polylignes 2D du dessin et les changer en polylignes ("allégées") via la commande "convert" (ou autre méthode)...

 

J'ai également je ne trouve pas le code DXF corresondant à l'épaisseur de lignes. Comment met-on la valeur correspondante: 0.13, 13, 0.13mm ?

 

Merci d'avance pour vos réponses.

 

[Edité le 6/8/2010 par vindaro]

Posté(e)

Bonjour,

 

Tu presente un sacré challenge :o

 

Cela fait quelque temps que j'essaye de trouvé un organigrame valable pour tout les cas.

Car a chaque cadastre, le dwg que l'on récupere a une structure légèrement differente.

Le nombre de blocs, le nombre calques, le type d'objet.....

De plus ce sont des blocs imbriqués

 

1) Exploser les blocs jusqu'a l'apparition des polylignes

2) les effacées car elle correspondent au cartouche

3)Exploser les blocs jusqu'a l'apparition des polylignes

4)convertir les polylignes 2d en polylignes

5)Les placer dans un calque Limite-Cadastrale

6)Exploser les blocs jusqu'a l'apparition des hachures

7)Les placer dans un calque Construction

 

Deja, a ce niveau c'est prise de tete car les niveaux d'imbrication change a chaque dessin

ensuite pour le cartouche par exemple il faut repeter l'operation deux ou trois fois,

pareil pour les limites cadastrales.

c'est jamais pareil

 

Mais cela est faisable en imbriquant correctement des conditions circonstancielles permetant de dicerner utilisation des objets.

 

c'est pour cela que je parlais d'organigrame.

 

il faut bien prendre sont temps pour analyser les different cas qui se presentent

 

Je sent que vais m'y remettre.......

Posté(e)

Salut,

 

On trouveras ici un LISP qui permet de convertir les polylignes 2d (old style) en polylignes optimisées (lwpolyline).

 

Fraid,

 

Plutôt que de décomposer tous les blocs pour convertir les polylignes, tu peux agir sur les définitions de blocs. Très facile en Visual LISP avec deux vlax-for (un 'foreach' qui agit sur les collections). De plus, comme les espaces objet et papier sont considérés comme des défintion de bloc, les polylignes dans ces espaces sont aussi traitées.

 

Exemple avec la routine'OldStyle2LwPolyline' du lien ci-dessus.

;; pour toutes les défintion de bloc du dessin courant,
(vlax-for b (vla-get-Blocks
      (vla-get-ActiveDocument (vlax-get-acad-object))
    )
 ;; pour toutes les entités,
 (vlax-for o b
   ;; si l'entité est une polyligne 2d
   (if	(= (vla-get-ObjectName o) "AcDb2dPolyline")
     ;; elle est convertie en lwpolyline
     (OldStyle2LwPolyline (vlax-vla-object->ename o))
   )
 )
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

merci Gile

 

c'est sympa de ta part de répondre aussi rapidement...

 

La procédure au-dessus tu ne l'aurais pas en VBA par hasard?

 

J'essaie de sélectionner des polylignes qui ont une couleur 255,204,51 et une épaisseur de ligne de 2.11mm en faisant de cette manière:

 

Dim Objet As AcadSelectionSet

Dim intCodes(0 To 1) As Integer

Dim varCodeValues(0 To 1) As variant

 

 

Set objet = ThisDrawing.SelectionSets.Add("26")

 

'intCodes(0) = 0

'varCodeValues(0) = "LWpolyline"

intCodes(1) = 62

varCodeValues(1) = RGB (255, 204, 251)

'intCodes(1) = 70

'varCodeValues(1) = "211"

 

objSS.Select acSelectionSetAll, , , intCodes, varCodeValues

 

Mais je n'arrive ni à sélectionner ni suivant la couleur, ni suivant l'épaisseur de ligne:

il m'ouvre une fenêtre: " Erreur d'éxécution: 6 Dépassement de capacité"

 

J'ai composé que cela aurait pu être lié au type de variable défini pour "varCodeValues" mais si je le change il n'accepte plus ma désignation "LWpolyline"...

 

Aurais-tu une réponse?

 

N.B.: Fraid Si tu arrives à tes fins je suis preneur.... :D :D

Posté(e)

Salut,

 

La procédure au-dessus tu ne l'aurais pas en VBA par hasard?

Non, je ne pratique pas VBA.

 

Mais je n'arrive ni à sélectionner ni suivant la couleur, ni suivant l'épaisseur de ligne:

il m'ouvre une fenêtre: " Erreur d'éxécution: 6 Dépassement de capacité"

Tu dépasse la capacité des 'arrays' que tu as instancié :

Dim intCodes(0 To 1) As Integer
Dim varCodeValues(0 To 1) As variant

(0 To 1) veut dire que ton array contiendra 2 éléments aux index 0 et 1. Si tu veux en mettre 3, il faut faire : (0 To 2).

 

Il faut aussi que tu regardes dans l'aide pour les codes DXF.

- 62 correspond au code pour les couleurs de l'index (valeurs de 0 à 256), pour les couleurs "vraies" (RVB) il faut utiliser le code 420 et la valeur doit être un entier entre 0 et 16777215 qui correspond à la somme : ValeurRouge * 65536 + ValeurVert * 256 + ValeurBleu.

- Le code de groupe pour l'épaisseur de ligne est 370 et sa valeur est de type entier.

 

Pour les codes DXF, le plus imple est certainement d'utiliser une expression LISP du style :

(mapcar 'print (entget (car (entsel))))

de sélectionner une entité ayant les propriétés recherchées et de lire la liste DXF dans la fenêtre de texte.

 

Pour tu filtre, ça devrait plutôt être un truc du genre :

Dim Objet As AcadSelectionSet
Dim intCodes(0 To 2) As Integer
Dim varCodeValues(0 To 2) As variant


Set objet = ThisDrawing.SelectionSets.Add("26")

'intCodes(0) = 0
'varCodeValues(0) = "LWPOLYLINE"
intCodes(1) = 420
varCodeValues(1) = 16764155
'intCodes(1) = 370
'varCodeValues(1) = 211

objSS.Select acSelectionSetAll, , , intCodes, varCodeValues 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut,

 

tout d'abord je voudrais te remercier de ton aide....

 

Seulement même avec les codes DXF que tu m'as laissé cela ne fonctionne pas (même sur un simple dessin d'une seule polyligne)

 

Public Sub essai()

Dim objSS As AcadSelectionSet

Dim intCodes(0 To 1) As Integer

Dim varCodeValues(0 To 1) As Variant

 

Set objSS = ThisDrawing.SelectionSets.Add("1")

 

intCodes(0) = 0

varCodeValues(0) = "LWpolyline"

intCodes(1) = 420

varCodeValues(1) = 12571233

 

objSS.Select acSelectionSetAll, , , intCodes, varCodeValues

 

objSS.Erase

 

ThisDrawing.Regen acAllViewports

ThisDrawing.SelectionSets("1").Delete

 

End Sub

 

 

J'ai fait des essais en ne prenant en compte que les polylignes et elles sont bien supprimées mais lorsque je ne sélectionne que cette couleur (191,210,97) (j'ai essayé avec d'autres) il ne me les efface pas...Aurais-tu un début de réponse?

 

(cela ne fonctione pas non plus avec les codes des épaisseurs de lignes)...

 

voilà ce que j'ai lorsque je fais la demande de renseignements avec la commande Lisp que tu m'as donné:

 

"(42 . 0.0)

(10 1.30087e+007 6.26326e+006)

(40 . 0.0)

(41 . 0.0)

(42 . 0.0)

(210 0.0 0.0 1.0)

; 1 feuille chargé à partir de #...">

Commande: "

 

D'ailleurs est ce que tu pourrais me dire à quoi font référence ces indications.

 

Merci d'avance pour tes réponses.

Posté(e)

Salut,

 

Comme je le disais, il est plus simple d'examiner la liste dxf retournée par l'expression LISP donnée plus haut, pour voir les code de groupes et leurs valeurs de l'entité sélectionnée.

 

Si tu dessine une entité en couleur 191,210,97 (ou que tu force la couleur d'une entité avec cette couleur), la liste retournée par l'expression LISP pour cette entité devrait contenir une paire : (420 . 12571233) code de groupe : 420, valeur : 12571233.

 

Si la liste ne contient ni groupe 62 (couleur de l'index) ni groupe 420, c'est que l'entité est en couleur DuCalque, dans ce cas, il faut faire la sélection en filtrant sur le calque.

 

D'ailleurs est ce que tu pourrais me dire à quoi font référence ces indications.

Chaque liste ou paire pointée représente un groupe DXF pour l'entité le premier nombre entier est le code groupe le reste de la liste est la valeur pour ce groupe, cetrtains groupes sont communs à toutes les entités, d'autres sont spécifiques ou ont une valeur spécifique au type d'entité.

 

Exemple pour un cercle :

 

(-1 . ) = nom d'entité de l'entité (ENAME en LISP, forme Hexagésimale de l'ObjectId en VBA)

(0 . "CIRCLE") = type d'entité

(330 . ) = nom d'entité du propriétaire (Owner en VBA)

(5 . "1DEB") = Handle de l'entité

(100 . "AcDbEntity") = marqueur de sous classe

(67 . 0) = Espace dans le quel est l'entité

(410 . "Model") = nom de l'onglet de présentation

(8 . "Calque7") = Calque

(62 . 53) = couleur de l'index

(420 . 12571233) = couleur 'vraie' (RGB)

(100 . "AcDbCircle") = marqueur de sous classe

(10 917.041 2663.72 0.0) = centre du cercle

(40 . 189.694) = rayon du cercle

(210 0.0 0.0 1.0) = direction d'extrusion

 

Regarde l'Aide aux développeurs d'AutoCAD > Référence DXF > Section ENTITIES

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Re-bonjour (gile),

 

je comprends car j'ai ouvert un dessin vierge...

je lui est dessiné une polyligne de cette couleur (191,210,97)...

ensuite j'ai essayé la petite macro mais rien ne se passait...lorsque j'enlevais la spécification "420 " la polyligne était supprimé...

j'ai alors changé de couleur et je lui ai mis une couleur vrai type 40 par exemple et là la macro me supprimait bien la polyligne alors j'ai effectué l'application lisp que tu m'avais envoyé et là j'avais le code suivant:

"(42 . 0.0)

(10 1.30087e+007 6.26326e+006)

(40 . 0.0)

(41 . 0.0)

(42 . 0.0)

(210 0.0 0.0 1.0)"

que veux dire la seconde ligne et la dernière? Pourquoi effectivement je n'ai pas le code 62 ou le code 420 qui apparait car ma polyligne n'était pas de la couleur "DuCalque" (c'était le calque 0 qui était noir)...

et de la même manière lorsque je lui spécifie l'épaisseur de ligne en code "370" je n'avais aucune action de la macro...

 

comme s'il ne reconnaissais pas ces codes 370 ou 420...

il n' y rien à réaliser au préalable pour activer ces codes DXF? (je travaille sous Autocad 2008)

 

Je te remercie encore pour ton aide précieuse.

 

PS: peux-tu me dire où je peux trouver le forum "'Aide aux développeurs d'AutoCAD", je sais c'est bête mais je ne le trouve pas...merci

 

Posté(e)

Salut

 

La liste dxf que tu donnes est incomplète.

Un liste DXF pour une entité commence toujours par :

(-1 . )

(0 . "TYPEDENTITE")

Il faut ouvrir la fenêtre de texte (F2) pour lire toute la liste.

 

Si tu veux n'avoir que la valeur d'un certain code de groupe tu peux utiliser cette expression (si le groupe n'existe pas, l'expression retourne: nil) :

pour le type d'entité :

(cdr (assoc 0 (car (entsel))))

pour la couleur de l'index :

(cdr (assoc 62 (car (entsel))))

pour la couleur vraie :

(cdr (assoc 420 (car (entsel))))

 

L'aide aux développeurs se trouve dans AutoCAD : menu Aide [?] > Ressources supplémentaires > Aide aux développeurs.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut,

 

Merci pour ta réponse et faut être idiot de ne pas avoir regardé jusqu'en haut de la fenêtre...

 

Mais encore une fois je ne comprends pas:

 

J'ouvre un dessin je dessine une polyligne de la couleur du calque et je lance la macro suivante:

 

Public Sub essai()

Dim objSS As AcadSelectionSet

Dim intCodes(0) As Integer

Dim varCodeValues(0) As Variant

 

Set objSS = ThisDrawing.SelectionSets.Add("2")

 

intCodes(0) = 0

varCodeValues(0) = "LWpolyline"

 

objSS.Select acSelectionSetAll, , , intCodes, varCodeValues

 

objSS.Erase

 

ThisDrawing.Regen acAllViewports

ThisDrawing.SelectionSets("2").Delete

 

End Sub

 

Là la polyligne est supprimée...je lance la même macro en changeant la couleur en couleur 30 et je modifie la macro en ajoutant le code 62 et la couleur 30. La polyligne est supprimée...

Je fait de même en changeant la couleur en couleur RGB 191,210,97 et en remplacant le code 62 par le code 420

et la couleur 30 par 12571233 (récupéré avec l'application que tu m'as donné:

 

(-1 . )

(0 . "LWPOLYLINE")

(330 . )

(5 . "190")

(100 . "AcDbEntity")

(67 . 0)

(410 . "Model")

(8 . "0")

(62 . 53)

(420 . 12571233)

(100 . "AcDbPolyline")

(90 . 6)

(70 . 128)

(43 . 0.0)

(38 . 0.0)

(39 . 0.0)

(10 4.34426 4.51881)

(40 . 0.0)

(41 . 0.0)

(42 . 0.0)

(10 6.77143 6.72875)

(40 . 0.0)

(41 . 0.0)

(42 . 0.0)

(10 9.98884 5.2053)

(40 . 0.0)

(41 . 0.0)

(42 . 0.0)

(10 7.44878 3.00476)

(40 . 0.0)

(41 . 0.0)

(42 . 0.0)

(10 5.22857 2.58158)

(40 . 0.0)

(41 . 0.0)

(42 . 0.0)

(10 2.09583 4.28371)

(40 . 0.0)

(41 . 0.0)

(42 . 0.0)

(210 0.0 0.0 1.0)

 

J'ai la réponse suivante sur la fenêtre de la commande:

"Autocad ne peut gérer la demande d'autorisation de service"

et dans la fenêtre autocad sur la ligne de commande j'ai "That command may not be invoked transaprently"

 

J'ouvre alors un nouveau dessin je refais une polyligne de la même couleur que précédemment je vérifie en lançant le lisp

 

(-1 . )

(0 . "LWPOLYLINE")

(330 . )

(5 . "18B")

(100 . "AcDbEntity")

(67 . 0)

(410 . "Model")

(8 . "0")

(62 . 53)

(420 . 12571233)

(100 . "AcDbPolyline")

(90 . 6)

(70 . 128)

(43 . 0.0)

(38 . 0.0)

(39 . 0.0)

(10 1.30087e+007 6.26326e+006)

(40 . 0.0)

(41 . 0.0)

(42 . 0.0)

(10 1.30087e+007 6.26326e+006)

(40 . 0.0)

(41 . 0.0)

(42 . 0.0)

(10 1.30087e+007 6.26326e+006)

(40 . 0.0)

(41 . 0.0)

(42 . 0.0)

(10 1.30087e+007 6.26326e+006)

(40 . 0.0)

(41 . 0.0)

(42 . 0.0)

(10 1.30087e+007 6.26326e+006)

(40 . 0.0)

(41 . 0.0)

(42 . 0.0)

(10 1.30087e+007 6.26326e+006)

(40 . 0.0)

(41 . 0.0)

(42 . 0.0)

(210 0.0 0.0 1.0)

 

Là la macro va jusqu'au bout mais ne me supprime pas la polyligne...

 

J'avoue que je ne comprends pas pourquoi la polyligne est supprimée avec la macro lorsque je lui précise la couleur vraie mais pas la couleur RGB? Est ce que ca viendrait de ce message? Et il en est de même pour les éopaisseurs de ligne en code 370...

 

Aurais-tu un début de réponse...

 

Merci encore

 

PS: Tu ne dors jamais? (dernier message à 5h36)?

 

 

 

 

je viens d'essayer sur un Autocad 2010 la procédure fonctionne correctement...

de plus je viens de m'apercevoir qu'en language VBA:

LWPolyligne = polyligne "améliorée"

Polyligne = polyligne 2D....[Edité le 10/8/2010 par vindaro]

 

 

Maintenant je bute sur:

 

Sélection d'une hachure d'une couleur RGB

Remplacer cette couleur par une couleur vrai

Mettre cette hachure en arrière plan...

 

Je n'arrête pas de t'embêter mais j'arrive presqu'au bout (enfin j'espère...)

 

Merci en tout cas pour tes réponses

 

[Edité le 10/8/2010 par vindaro]

Posté(e)

Bonjour,

 

Voila ce que jai obtenu

 

http://www.sendbox.fr/RB9R5K8C9PFY/Temp.rar

 

j'ai fournis une dizaine d'extraits cadastraux venant d'Illustrator

(sans toucher au option d'export)

 

un fichier nommé calques.dwg qui evite de devoir creer des calques et ramener un type de lignes en lisp

 

Le lisp cada.lsp qui me permet d'obtenir le cadastre a la charte voulue.

 

Probleme n°1:

Comment selectionner un bloc qui contient une polyligne d'une longueur superieur a 10000

(Il y a 2 cas ou la limite communale coupe la page et dans ce k la il y a un bloc supplementaire a gerer)

 

Probleme n°2:

Comment selectionner les polylignes formant un rectangle // au scu?

 

 

Posté(e)

Salut,

 

vindaro,

 

Comme je le disais plus haut, je ne pratique pas le VBA, je connais un peu l'interface COM/ActiveX utilisée par VBA (mais aussi par Visual LISP, dotNET etc.) et les manipulations de codes DXF (AutoLISP oblige).

Ton problème semble directement lié au langage VBA, je te conseille donc de poster dans le forum adéquat, des spécialistes te répondront certainement.

 

PS : tu appelles "couleur vraie" les couleurs de l'index (de 0 à 256) alors qu'AutoCAD appelle "couleurs vraies" les couleurs RGB.

 

Fraid,

 

Je crains que tu ne te sois trompé de fil de discussion...

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut,

 

Fraid, je n'arrive pas à télécharger ton fichier: "Sorry but this file reached max downloads limit"...

 

Je ne comprends pas le problème n°1 mais en ce qui concerne le problème n°2 s'il s'agit du cadre du cadastre on peut peut-être le supprimer suivant son périmètre ou sa surface car normalement ils ne changent pas d'un extrait à un autre si on garde la même échelle au moment de l'export...

 

 

Gile je voulais te remercier pour tous les précieux conseils que tu m'as prodigué.

 

bonne continuation à toi et peut-être (même surement) à bientôt cette fois sur de la programmation en lisp ou en .NET.

 

Je vais suivre ton conseil et je vais poster sur le forum de VBA.

 

A+.

  • 1 an après...
Posté(e)

Je crois avoir la solution à ton problème. Enfin, pour ce que j'y ai compris. As-tu essayé la méthode qui consiste segmenter ton fichier en plusieurs calques nommés selon des catégories du genre: ligne de contour, ligne de cadastre, fondation, arbres, mur, plate-bande et de gérer tes objets à partir des calque en modifiant les propriétés de ligne, épaisseur etc. ? J'ai travaillé à partir de cette méthode et j'ai resté surpris du résultat

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é