Aller au contenu

Selection autour d\'un texte


chris_mtp

Messages recommandés

Bonjour à tous,

 

J'ai un fichier avec des parcelles non closes.

Ces parcelles sont délimités par des lignes ou des polylignes qui se joignent mais une parcelle n'est pas représenté par une polyligne 2D fermée, ce que je souhaite réaliser.

Dans toutes les parcelles se trouve un et un seul texte.

J'aurai besoin d'une routine qui me sélectionne toutes les entités autour de ce texte et par la suite me tracer un polygone fermée pour créer la parcelle.

 

Je ne vois pas comment m'y prendre car il n'existe pas sous Autocad une sélection qui s'effectue autour d'une entité du moins à ma connaissance d'où ma question ?

 

Avez vous à disposition ce genre de routine ?

 

Merci par avance de votre aide.

John

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

bpoly peut aussi s'utiliser comme une fonction LISP :

(bpoly pt)

pt doit être défini dans le SCU courant, attention au zoom courant (le contour doit être affiché).

 

Le problème avec bpoly, c'est que si les contours ne permettent pas de créer une polyligne (uniquement segments droits et arcs de cercle), il faut répondre à une invite :

"Impossible de dériver le contour de la polyligne. Créer une région? "

 

Pour palier à ce problème, j'ai fait une petite routine :

 

;; gc:bpoly
;; Retourne le nom d'entité du contour créé à partir du point spécifié
;;
;; Arguments
;; pt : un point à l'intérieur du contour (coordonnées SCU courant)
;; fl : si nil permet la création d'une région si la nature des contours l'exigent
(defun gc:bpoly	(pt fl / ent)
 (setq ent (bpoly pt))
 (if (    (if	fl
     (setq ent (command))
     (progn
(command "")
(setq ent (entlast))
     )
   )
 )
 ent
)

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

En effet, même sans LISP la commande standard Dessin > Contour devrait faire l'affaire. :)

 

(gile), pourrais-tu stp expliquer un peu le fonctionnement de ta routine ?

 

Avec mon niveau très limité en LISP (pour le moment... :P ), il y a plusieurs choses que je ne saisis pas :

- que signifie gc: ?

- je ne comprends pas le fonctionnement de la partie (if fl ...), et en particulier (setq ent (command))... :casstet:

Lien vers le commentaire
Partager sur d’autres sites

(gile), pourrais-tu stp expliquer un peu le fonctionnement de ta routine ?

 

Je vais essayer.

 

Tout d'abord, quand on écrit une routine de ce type, c'est celui qui l'écrit qui choisit délibérément le comportement qu'il souhaite qu'elle ait (en composant, bien sûr, avec les possibilités existantes).

J'ai voulu ici faire une sous-routine, utilisable dans dans d'autres routines ou commandes de la même façon que les fonctions LISP natives, qui retourne le nom d'entité (ename) de l'objet créé ou nil si aucun objet n'est créé.

 

La fonction LISP bpoly utilisée dans la routine lance la commande -CONTOUR en ligne de commande.

L'intérêt d'utiliser la fonction LISP plutôt que la commande réside dans le fait que cette fonction retourne directement le nom d'entité de la polyligne créée alors qu'une expression (command ...) retourne toujours nil (on y reviendra).

L'inconvénient de cette fonction, comme dit plus haut, c'est qu'elle requiert une intervention de l'utilisateur au cas où les objets constituant le contour ne sont pas tous des segments droits ou des arcs de cercle.

C'est pour contourner ceci que j'ai écrit gc:bpoly.

 

- que signifie gc: ?

Il s'agit juste d'un préfixe que j'utilise (de plus en plus systématiquement) pour éviter les éventuels conflits avec d'autres routines qui pourrait avoir le même nom. Il s'agit de mes initiales, j'aurais très bien pu choisir tout autre chose...

 

(defun gc:bpoly (pt fl) ...)

Donc la fonction s'appelle gc:bpoly et requiert 2 arguments :

- pt : un point qui sera passé comme argument à la commande native bpoly

- fl : un 'drapeau' (flag) qui permet d'offrir le choix entre deux options suivant que sa valeur est nil ou non.

J'ai voulu par là permettre à l'utilisateur de cette routine de choisir entre créer une région si cela est possible ou de n'accepter que les polylignes.

(gc:bpoly T) ne créera que des polylignes (ou rien).

(gc:bpoly nil) créera aussi des régions.

 

(setq ent (bpoly pt))

Dans un premier temps, la routine appelle la fonction native bpoly et lui passe pt comme argument.

Si un contour de type polyligne est créé ou si le contour n'est pas fermé la commande CONTOUR appelée par bpoly s'arrête là.

 

(if (

En interrogeant la valeur de la variable système CMDACTIVE on peut savoir si une commande est active. Ici, si c'est le cas, c'est que la commande contour n'est pas terminée, donc que les contours ne permettent pas de créer une polyligne et qu'il est proposé à l'utilisateur de créer une région. 
Il est à noté que, même dans ce cas, l'expression (setq ent (bpoly pt)) a quand même affecté à [b]ent [/b]un nom d'entité, qui n'est pas celui de la polyligne créée puisqu'il n'y en pas eu mais d'une des entités constituant le contour.
 
[code](if fl ...)

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

Lien vers le commentaire
Partager sur d’autres sites

(if fl ...)

 

Une petite précision.

Contrairement à la plupart des autres langages de programmation, en LISP, les fonctions conditionnelles qui utilisent un prédicat (if, cond while, etc.) ne requièrent pas un argument de type Booléen Vrai/Faux (true/false) mais se contentent d'une valeur nil ou non nil.

C'est ce qui permet de faire par exemple :

(if (setq pt (getpoint)) ...) l'expression (setq pt (getpoint)) retournant soit un point (valeur non nil) soit nil si l'utilisateur n'a pas spécifié de point.

 

Petit exemple d'utilisation de la routine gc:bpoly dans une commande :

 

(defun c:test (/ pt ent)
 (if
   (and
     (setq pt (getpoint "\nSpécifiez un point: "))
     (setq ent (gc:bpoly pt nil))
   )
    (alert (strcat "Création d'une : " (cdr (assoc 0 (entget ent)))))
    (alert "Aucune entité créée")
 )
 (princ)
)

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

Lien vers le commentaire
Partager sur d’autres sites

bpoly peut aussi s'utiliser comme une fonction LISP :

 

(bpoly pt)

pt doit être défini dans le SCU courant, attention au zoom courant (le contour doit être affiché).

 

Le problème avec bpoly, c'est que si les contours ne permettent pas de créer une polyligne (uniquement segments droits et arcs de cercle), il faut répondre à une invite :

"Impossible de dériver le contour de la polyligne. Créer une région? "

 

(bpoly) a d'autres options que j'avais évoqué ici

 

Et ta remarque sur "Impossible de dériver le contour de la polyligne. Créer une région? " répond je pense à une question que je me posais sur un paramètre que je ne savais pas à quoi il pouvait servir.

 

Après un test rapide je pense qu'il sert à cela (T pour ignorer la transformation en région: ne pose pas la question et ne fait rien)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Bonjour pierrevigneux

 

Je ne comprends pas bien ta demande.

Les applications sont nombreuses.

 

Dans mon cas, j'ai des parcelles qui sont composées de plusieurs lignes polylignes non jointives entre elles. J'ai, dans le cadre de mon travail, besoin de créer des polylignes fermées pour chaque parcelle. J'ai dans chacune de mes parcelles un texte qui correspond au numéro de lot, du coup

je clique sur le point d'insertion de mon texte en faisant attention de bien avoir dans ma fenêtre autocad la totalité du contour de ma parcelle et la fonction _bpoly fait le reste à savoir créer une polyligne fermée de la parcelle.

 

Après je les automatiser pour faire la liste de tous mes points d'insertion de mes textes numéro de lot et le lisp me crée toutes les parcelles concernées. Certaines des parcelles ne sont cependant pas traités mais je suis en train d'y remedier

 

Entre parenthèses

Je suis en train de travailler avec FME en ce moment sur un projet cadastral mais je butte un peu sur certaines fonctions du coup je retravaille certains de mes dessins en lisp.

FME doit le faire très bien et surtout avec une rapidité supérieure au lisp mais comme tout logiciel ou language de programmation, il demande un temps de compréhension et d'adaptation...

 

En espérant avoir répondu à ta question

 

John

Lien vers le commentaire
Partager sur d’autres sites

  • 2 mois après...

Bonjour à tous,

 

J'ai une question sur ce post.

Je me trouve avec un fichier parcellaire ou je dois faire des présentations de certaines parcelles.

 

Comment faire pour sélectionner la polyligne 2D fermée qui englobe par exemple un texte bien précis et par exemple la mettre en couleur ?

 

Etant donné que mon texte est le numéro de lot par exemple.

 

Merci par avance de votre aide.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je ne suis pas sûr de bien comprendre la demande, mais la routine SelBoundary ci-dessous retourne la plus proche polyligne fermée englobant le texte ou mtexte qui lui est passée en argument.

Cette routine appelle SelByObj qui se trouve dans Special_Selection.lsp sur cette page.

 

;; Retourne la plus proche polyligne englobant le texte (ou nil)
;;
;; Argument
;; txt : le texte ou mtext (ename)

(defun selBoundary (txt / elst ss n loop sel i ent)
 (setq elst (entget txt))
 (if (setq ss (ssget "_F"
	      (list (cdr (assoc 10 elst)) (getvar 'extmax))
	      '((0 . "LWPOLYLINE") (-4 . "&") (70 . 1))
       )
     )
   (progn
     (setq loop T
    n -1
     )
     (while (and loop (setq pl (ssname ss (setq n (1+ n)))))
(if (setq sel (SelByObj pl "WP" (list '(0 . "*TEXT") (assoc 1 elst))))
  (progn
    (setq i -1)
    (while (and loop (setq ent (ssname sel (setq i (1+ i)))))
      (if (equal txt ent)
	(setq loop nil)
      )
    )
  )
)
     )
   )
 )
 pl
)

;; Commande de test
(defun c:test (/ txt pl)
 (if (and (setq txt (car (entsel "\nSélectionnez un texte: ")))
   (wcmatch (cdr (assoc 0 (entget txt))) "*TEXT")
   (setq pl (selBoundary txt))
     )
   (sssetfirst nil (ssadd pl))
   (sssetfirst nil nil)
 )
 (princ)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Quel est l'intérêt de faire ça en lisp plutôt que de sélectionner tes polylignes à la main et de changer leur couleur ensuite ?

Puisque d'après ce que j'ai compris il faudra de toute manière cliquer sur les textes, autant cliquer directement sur la polyligne, je ne vois pas trop le gain de temps qu'un lisp pourrait apporter.

 

Avec plus d'infos et un dessin exemple, peut-être que ça motivera quelqu'un pour se pencher sur ta question... ;)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Quel est l'intérêt de faire ça en lisp plutôt que de sélectionner tes polylignes à la main et de changer leur couleur ensuite ?

Puisque d'après ce que j'ai compris il faudra de toute manière cliquer sur les textes, autant cliquer directement sur la polyligne, je ne vois pas trop le gain de temps qu'un lisp pourrait apporter.

 

Avec plus d'infos et un dessin exemple, peut-être que ça motivera quelqu'un pour se pencher sur ta question... ;)

C'est dans la commande de test qu'il faut sélectionner le texte.

La routine SelBoundary fonctionnant avec un ENAME comme argument peut être utilisée sans intervention de l'utilisateur pour chaque texte (après un sélection de plusieurs ou tous les textes).

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

Lien vers le commentaire
Partager sur d’autres sites

La routine SelBoundary ne fait pas partie de Special_Selection, c'est juste un exemple de ce qu'on peut faire en utilisant SelByObj qui elle est inclue dans Special_Selection.

 

SelByObj, qui sert ici à vérifier si le texte est bien à l'intérieur de la polyligne, ne fonctionne qu'avec les objets curvilignes (cercles ellipses, polylignes), Les Mpolygons sont des objets plus proches des hachures et donc beaucoup plus compliqués à utiliser dans ce cas.

 

Si tu veux sélectionner le cercle englobant, il suffit de remplacer :

'((0 . "LWPOLYLINE") (-4 . "&") (70 . 1))

par :

'((0 . "CIRCLE"))

dans la routine SelBoundary.

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour et Merci a tous pour vos reponses,

Bryce Le but est de faire les plans individual des lots d'un lotissement

Donc cette routine de Gile (Merci encore) me sera tres utile car des lord Je Peux zoomer et faire une presentation sur un lot donnee

Merci De votre aide

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é