chris_mtp Posté(e) le 23 janvier 2011 Posté(e) le 23 janvier 2011 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
Carboleum Posté(e) le 23 janvier 2011 Posté(e) le 23 janvier 2011 pourquoi pas la commande _bpoly ? Carboléüm, qui dessine aussi à la main -> Carboleum's sketchblog
(gile) Posté(e) le 23 janvier 2011 Posté(e) le 23 janvier 2011 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
bryce Posté(e) le 23 janvier 2011 Posté(e) le 23 janvier 2011 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: Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
(gile) Posté(e) le 23 janvier 2011 Posté(e) le 23 janvier 2011 (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
(gile) Posté(e) le 23 janvier 2011 Posté(e) le 23 janvier 2011 (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
bryce Posté(e) le 23 janvier 2011 Posté(e) le 23 janvier 2011 Super, merci beaucoup pour cette réponse très complète ! :) Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
chris_mtp Posté(e) le 23 janvier 2011 Auteur Posté(e) le 23 janvier 2011 Bonjour à tous, Je ne connaissais pas du tout la fonction Bpoly.Merci encore de votre aide et des explications de Gile.Ca marche nickel chrome AmicalementJohn
pierrevigneux Posté(e) le 24 janvier 2011 Posté(e) le 24 janvier 2011 Bonjour chris_mtp Tu peux me montrer un exemple de ta commande crée par Gile. Merci! Acadnadien
bonuscad Posté(e) le 24 janvier 2011 Posté(e) le 24 janvier 2011 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
chris_mtp Posté(e) le 25 janvier 2011 Auteur Posté(e) le 25 janvier 2011 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 coupje 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èsesJe 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
pierrevigneux Posté(e) le 25 janvier 2011 Posté(e) le 25 janvier 2011 Merci chris_mtp de ta réponse! Je m'en doutais un peu, donc tu complète ta parcelle de lot avec _bpoly et par la suite tu peux prendre Totalarea de Gile pour y indiquer sa superficie.Très utile. Bonne journée. Acadnadien
VtKp Posté(e) le 17 avril 2011 Posté(e) le 17 avril 2011 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.
VtKp Posté(e) le 17 avril 2011 Posté(e) le 17 avril 2011 Je me casse la tete depuis une semaine sur ce probleme sans vraiment Trouver dd solution.Merci encore de votre aide [Edité le 17/4/2011 par VtKp]
VtKp Posté(e) le 18 avril 2011 Posté(e) le 18 avril 2011 Bonjour a tousJe pense qu'il faudrait faire une recherche texte du numero de lot Mais après Vient Le problem de Trouver la polyligne englobante et la Je ne void pas comment faire serieux ...... Merci par avance de votre aide
(gile) Posté(e) le 18 avril 2011 Posté(e) le 18 avril 2011 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
bryce Posté(e) le 18 avril 2011 Posté(e) le 18 avril 2011 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... ;) Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
(gile) Posté(e) le 18 avril 2011 Posté(e) le 18 avril 2011 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
bryce Posté(e) le 18 avril 2011 Posté(e) le 18 avril 2011 Salut (gile), Ma question s'adressait à VtKp, toi et moi avons posté au même moment (toi quelques secondes avant moi manifestement...). ;) Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
lecrabe Posté(e) le 18 avril 2011 Posté(e) le 18 avril 2011 Hello Gilles Je ne connaissais pas cette fonction de ton kit "Special_Selection" ! :) SVP serait il possible d'avoir aussi le Cercle ou MPolygon ENGLOBANT le plus proche d'un Text ou MText ? Le Decapode Autodesk Expert Elite Team
(gile) Posté(e) le 18 avril 2011 Posté(e) le 18 avril 2011 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
VtKp Posté(e) le 19 avril 2011 Posté(e) le 19 avril 2011 Bonjour et Merci a tous pour vos reponses,Bryce Le but est de faire les plans individual des lots d'un lotissementDonc cette routine de Gile (Merci encore) me sera tres utile car des lord Je Peux zoomer et faire une presentation sur un lot donneeMerci De votre aide
pierrevigneux Posté(e) le 19 avril 2011 Posté(e) le 19 avril 2011 Bonjour Vtpk Pourrais-tu me montrer un exemple de ton application. Merci! Acadnadien
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