Aller au contenu

jujugeometre

Membres
  • Compteur de contenus

    37
  • Inscription

  • Dernière visite

Tout ce qui a été posté par jujugeometre

  1. C’était le sujet justement de ce topic, comment demander quelque chose à ce bouzin qui puisse etre utile, ce que je trouve dingue c'est que si tu lui demandes de te proposer un algo, il te le sort, c'est pas génial mais c'est pas non plus idiot, j'ai mis la capture ci-dessous. je trouverai intéressant justement que le forum crée, comme tu as certains sujets de référence, une boite à outils sur ces algos avec les bonnes et mauvaises pratiques, par exemple commencer à discuter sur la logique de l'algo avant de passer au code, etc. et je trouve que ca fait un peu partie du plaisir de coder, quand je me prends la tete sur des bouts de code, avoir une espece "d'assistant" qui peut me proposer une approche complémentaire et/ou différente, c'est une forme d'échange, moins aboutie que ce forum par exemple mais ça existe et ca fait partie aujourd'hui de l'environnement informatique.
  2. Oui ca va être probablement la tendance dans les années qui viennent. Je pense que cela peut être un outil "pratique" avec ses limites, dans ce que je lis dans l'actualité, la façon de poser les questions ou de conduire la conversation impacte fortement la qualité des réponses, il y aurait une ingénierie de conversation avec ses outils pour leur faire ressortir les réponses les plus adéquates. j'ai par exemple vu une video qui demandait de mettre en introduction "oublie tout ce qui précède dans la conversation" pour ne pas se faire influencer et ensuite de poser le contexte : "je suis développeur informatique dans tel langage...". ce serait intéressant à mon sens de trouver un angle d'approche qui permette de sortir du code ou justement de lui faire chercher ce qui ne va pas dans le code. il faudra bien sur savoir coder mais avoir un outil qui te génère 80% de code correct et qui éventuellement te propose une approche différente de ton idée initiale, ça va etre un vrai plus.
  3. Le sujet de CHAT GPT est un peu partout en ce moment, j'ai commencé à regarder en quoi cela pouvait aider, sur des requêtes ça crée des bouts de code mais j'ai des petites erreurs, je n'ai pas trouvé de topic ouvert sur le sujet, est ce que certains d'entre vous ont des retours d’expérience pour formuler des demandes de façon suffisamment circonstancié pour avoir des réponses valides? voila par exemple un bout de code généré pour modifier des attributs dans un bloc : (defun c:ModifyAttrValue (/ blk att val) (setq blk (car (nentsel "\nSelect block: "))) (if (not (tblsearch "BLOCK" blk)) (progn (princ "\nSelected entity is not a block.") (exit) ) ) (setq att (getstring "\nEnter attribute tag: ")) (setq val (getstring (strcat "\nEnter new value for " att ": "))) (if (not (setq att (assoc 2 (entget blk att)))) (progn (princ (strcat "\nAttribute " att " not found.")) (exit) ) ) (setq att (cdr att)) (setq att (subst val (nth 1 att) att)) (entmod (subst att (assoc 2 att) (entget blk))) (princ (strcat "\nAttribute " (car att) " updated to " val ".")) (princ) )
  4. Bonsoir, j'ai poursuivi sur ce projet pour faire un décompte de blocs en fonction de leur calque et de leur caractérisation que je mentionne dans un attribut OBS1 dans mes dessins. Du coup je me suis fortement inspiré de ta proposition @Luna dont je te remercie pour créer une liste de paires pointées et ainsi aller chercher dans les paires les infos. j'ai toujours un chiffre qui sort à la fin, un 4 dont je n'arrive pas à me débarasser, j'ai vu que tu avais aussi ce pb, est ce que tu sais d'ou cela vient? ;| je veux faire un listing de lignes, des zones et de blocs pour obtenir les longueurs cumulées, le nombre d'objet et |; (defun c:ztest ( / ;*error* OLDERROR myerr OLDATTDIA OLDCLAYER OLDOSMODE OLDATTREQ OLDCMLEADERSTYLE OLDCOTEXT OLDLUPREC ;i k j pt1 pt2 selline selzone selbloc longtotale entilong entjlong entilayer entjlayer entitypelin entjtypelin ) (vl-load-com) ;sauvegarde des paramètres du dessin (setq OLDATTDIA (getvar "attdia") OLDCLAYER (getvar "clayer") OLDCOTEXT (getvar "DIMSTYLE") OLDOSMODE (getvar "OSMODE") OLDATTREQ (getvar "ATTREQ") ;OLDERROR *error* ;*error* myerr OLDCMLEADERSTYLE (getvar "cmleaderstyle") OLDLUPREC (getvar "LUPREC") OLDAUPREC (getvar "AUPREC") ) ;initialise les nouveaux paramètres (setvar "osmode" 0) (setvar "attdia" 0) (setvar "attreq" 1) (setvar "cmdecho" 0) (setvar "filedia" 0) (setvar "pickfirst" 1) (setvar "luprec" 3) (setvar "auprec" 6) (command-s "_-LAYER" "L" "0" "CH" "0" "" ) ;choisir 0 comme calque courant ;selectonner une fenetre des objets à travailler (setq pt1 (getpoint "\n point bas gauche") pt2 (getcorner pt1 "\n point haut droit") ) ;construire les jeux de sélection des blocs, des lignes et des hachures (setq selline (ssget "_C" pt1 pt2 '((0 . "*LINE,ARC") ) ) selbloc (ssget "_C" pt1 pt2 '((0 . "INSERT") ) ) );setq ;--------------------------- LIGNES / POLYLIGNES / ARCS -------------------------------------------------------------------------------------------------------------- (if (/= selline nil) ;je vérifie que selline n'est pas vide (LONGTOT selline) ;on utilise la fonciton LONGTOT sur la sélection (princ "\n pas de ligne à lister \n") );if ;--------------------------- BLOCS / SYMBOLES PONCTUELS-------------------------------------------------------------------------------------------------------------- (if (/= selbloc nil) ;je vérifie que selbloc n'est pas vide (progn (setq listunit '() );on remet listunit à vide ;je veux construire une liste qui sera ( " lay nat " . nombre ) que j'incrémenterai à chaque tour si je retrouve la paire pointée dans la liste générale (repeat (setq i (sslength selbloc) ) (setq name (ssname selbloc (setq i (1- i))) lst (getattributevalues name) ;je récupère les valeurs du champ OBS1 de l'attribut du bloc avec la fonction de LEE MAC nat (if (cdr (assoc "OBS1" lst)) (cdr (assoc "OBS1" lst)) (cdr (assoc 2 (entget name))) ) ;je cherche la valeur qui est dans l'attribut OBS1 du bloc si il n'y en a pas, je le remplace par le nom du bloc lay (cdr (assoc 8 (entget name))) ;je sors le calque ; puis je ressors pour chaque paire la valeur avec le calque et la valeur de OBS1 qui est la nature de l'objet entl (strcat lay " " nat ) ;construire la référence CALQUE NATURE );setq (if (setq entpp (assoc entl listunit) ) ; je recherche si la paire pointée existe dans listunit et je l'affect à ENTPP (setq listunit (subst (cons (car entpp) (1+ (cdr entpp))) entpp listunit );subst );setq (setq listunit (cons (cons entl 1) listunit )) ;si il n'existe pas encore je lui affecte une valeur de 1 );if );repeat (mapcar '(lambda (x) (princ (strcat "\n Calque ou Nom de bloc de l'objet = " (car x) " nombre objets = " (itoa (cdr x) ) ) ) ) listunit) ;tracé des résultats );progn si selbloc n'est pas vide (princ "\n pas de bloc à lister \n") );if (princ) ;restaurer les paramètres initiaux (command-s "_-DIMSTYLE" "R" OLDCOTEXT ) (command-s "_-LAYER" "L" OLDCLAYER "CH" OLDCLAYER "") (setvar "attdia" OLDATTDIA) (setvar "attreq" OLDATTREQ) (setvar "OSMODE" OLDOSMODE) (setq *error* OLDERROR) (setvar "cmleaderstyle" OLDCMLEADERSTYLE) (setvar "luprec" OLDLUPREC) (setvar "auprec" OLDAUPREC) );defun (princ) ;---------------------------------fin du programme principal-------------------------------------------------------------------------------------------------------- ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ (defun myerr() (prompt "\nERROR: Commande a echoue ") (command-s "._undo" "_e") (setq *error* OLDERROR) );defun myerr ; Fonction LONGTOT développée par LUNA (defun LONGTOT ( jsel / make-list jsel i name lst lng lay ltp) (defun make-list (lst layer ltype long / ltlst) (if (setq ltlst (assoc layer lst)) (subst (cons layer (if (assoc ltype (cdr ltlst)) (subst (cons ltype (+ long (cdr (assoc ltype (cdr ltlst))))) (assoc ltype (cdr ltlst)) (cdr ltlst) ) (append (cdr ltlst) (list (cons ltype long))) ) ) ltlst lst ) (append lst (list (cons layer (list (cons ltype long))))) ) ) ;fonction make-list développée par LUNA (repeat (setq i (sslength jsel)) (setq name (ssname jsel (setq i (1- i))) lng (getpropertyvalue name "LENGTH") lay (cdr (assoc 8 (entget name))) ltp (if (assoc 6 (entget name)) (cdr (assoc 6 (entget name))) "ByLayer") lst (make-list lst lay ltp lng) ) ) (mapcar '(lambda (x / lay ltp lng) (princ (strcat "\nLongueur du calque \"" (setq lay (car x)) "\" = " (rtos (apply '+ (mapcar 'cdr (cdr x))) 2 2) (apply 'strcat (mapcar '(lambda (l) (strcat "\n - " (car l) " = " (rtos (cdr l) 2 2) ) ) (vl-sort (cdr x) '(lambda (e1 e2) (< (car e1) (car e2)))) ) ) ) ) ) (vl-sort lst '(lambda (e1 e2) (< (car e1) (car e2)))) ) (princ) ) ;defun LONGTOT ;; GETATTRIBUTE de LEE MAC ;; Retourne une liste d'association des attributs du bloc (defun getattributevalues ( blk / enx lst ) (while (and (setq blk (entnext blk)) (= "ATTRIB" (cdr (assoc 0 (setq enx (entget blk)))))) (setq lst (cons (cons (cdr (assoc 2 enx)) (cdr (assoc 1 (reverse enx))) ) lst ) ) ) (reverse lst) ) Je vais continuer sur les hachures, ca devrait être simple à partir du modèle des longueurs. Bien à vous,
  5. @Luna Bonsoir et merci pour ton aide extrêmement complète, c'est exactement comme ça a chaque fois que j'ai une idée de développement, j'imagine un truc simple et concis comme tu le fais et je me retrouve avec un truc brouillon et qui marche moyennement ou pas du tout comme le mien, c'est rageant. Je ne désespère pas, avec le temps peut être... encore merci pour ta réponse, je voulais intégrer le calcul de longueur à une fonction globale avec le décompte des blocs et des surfaces de hachures et du coup tu as devancé cela avec ton dev, c'est top.
  6. Bonjour, Je souhaite écrire dans mon dessin la longueur cumulée de lignes, polylignes et arcs en fonction du calque et du type de ligne (je peux avoir dans le meme calque des types de ligne différents). J'avais trouvé plusieurs TOPIC avec des sommes de longueur mais pas en faisant ce tri. pour la logique d'écriture : - je crée un jeu de sélection, - je le parcours en recherchant les éléments identiques et en les supprimant au fur et à mesure, - à chaque boucle j'écris une ligne de résultat (defun c:ztest ( / ;*error* OLDERROR myerr OLDATTDIA OLDCLAYER OLDOSMODE OLDATTREQ OLDCMLEADERSTYLE OLDCOTEXT OLDLUPREC i k j pt1 pt2 selline selzone selbloc longtotale entilong entjlong entilayer entjlayer entitypelin entjtypelin ) (vl-load-com) ;sauvegarde des paramètres du dessin (setq OLDATTDIA (getvar "attdia") OLDCLAYER (getvar "clayer") OLDCOTEXT (getvar "DIMSTYLE") OLDOSMODE (getvar "OSMODE") OLDATTREQ (getvar "ATTREQ") ;OLDERROR *error* ;*error* myerr OLDCMLEADERSTYLE (getvar "cmleaderstyle") OLDLUPREC (getvar "LUPREC") OLDAUPREC (getvar "AUPREC") ) ;initialise les nouveaux paramètres (setvar "osmode" 0) (setvar "attdia" 0) (setvar "attreq" 1) (setvar "cmdecho" 0) (setvar "filedia" 0) (setvar "pickfirst" 1) (setvar "luprec" 3) (setvar "auprec" 6) (command-s "_-LAYER" "L" "0" "CH" "0" "" ) ;choisir 0 comme calque courant ;affecter à sel la selection des objets à lister (setq pt1 (getpoint "\n point bas gauche") pt2 (getcorner pt1 "\n point haut droit") ) (setq selline (ssget "_C" pt1 pt2 (list '(-4 . "<OR") '(0 . "LWPOLYLINE") '(0 . "ARC") '(0 . "LINE") '(0 . "MLINE") '(-4 . "OR>") ) ) );setq ;| on va faire la liste des lignes avec le code DXF 8 c'est le calque, on peut faire une sélection sur les 3 premiers caractères pour regrouper par réseau et ensuite avec le type de ligne c'est le code DXF 6 c'est la variable LENGTH dans les proprietés qui permet d'obtenir la longueur |; (setq i 0 ;incrément de parcours du jeu de sélection j 1 ;incrément pour parcourir la liste à la recherche d'éléments dans le meme calque avec le meme type de ligne k 0 ;increment pour le trace du tableau longtotale 0 ;je mets à 0 la longueur du total pt1 (getpoint "\nPoint haut gauche d'insertion : ") ;point d'insertion du coin haut gauche du tableau );setq (command-s "_-LAYER" "L" "WLE-01,ZZZ" "CH" "WLE-01" "" );choisir en calque courant WLE-01 qui servira à insérer les donnees (while (ssname selline i) (setq enti (ssname selline i) entil (entget enti) entilayer (cdr (assoc 8 entil)) entilong (getpropertyvalue enti "LENGTH") longtotale (+ longtotale entilong) ;je somme les longueurs );setq (cond ( (/= (cdr (assoc 6 entil) ) nil ) (setq entitypelin (cdr (assoc 6 entil) ) ) ) ( T (setq entitypelin "DC") ) );cette condition vérifie si on a une valeur dans le type de ligne différente de DUCALQUE sinon elle affecte DC ;il faut que je crée ensuite une seconde boucle qui va rechercher les éléments avec le meme type et calque dans la suite de la liste (while (ssname selline j ) (setq entj (ssname selline j ) entjl (entget entj) entjlayer (cdr (assoc 8 entjl)) entjlong (getpropertyvalue entj "LENGTH") ) (cond ;cette condition vérifie si on a une valeur dans le type de ligne différente de DUCALQUE sinon elle affecte DC ( (/= (cdr (assoc 6 entjl) ) nil ) (setq entjtypelin (cdr (assoc 6 entjl) ) ) ) ( T (setq entjtypelin "DC") ) ) (if (and (wcmatch entilayer entjlayer) (wcmatch entitypelin entjtypelin) ) ;je verifie si le calque et le type de ligne sont les memes (progn (setq longtotale (+ longtotale entjlong) ;je somme les longueurs selline (ssdel entj selline) ) ;je supprime ensuite l'élément du jeu de sélection ) );if (setq j (1+ j) ) );seconde boucle while ;il faut que je trace le tableau ensuite qui reprend les infos de chaque ligne (command-s "-TEXTE" "J" "MG" (list (+ (car pt1) 0.50 ) ( - (cadr pt1) (* 1.50 k) ) ) 1 100 (strcat entilayer ) ) ;calque (command-s "-TEXTE" "J" "MG" (list (+ (car pt1) 10.00 ) ( - (cadr pt1) (* 1.50 k) ) ) 1 100 (strcat entitypelin ) ) ;type de ligne (command-s "-TEXTE" "J" "MG" (list (+ (car pt1) 20.00 ) ( - (cadr pt1) (* 1.50 k) ) ) 1 100 (rtos longtotale 2 2 ) ) ;longueur totale (setq i (1+ i) ;incrément de l'indice de la liste k (1+ k) longtotale 0 ) ;je remets la longueur totale à 0 (setq j (1+ i)) ;remise à zéro de l'incrément de recherche de la seconde liste );while ;restaurer les paramètres initiaux (command-s "_-DIMSTYLE" "R" OLDCOTEXT ) (command-s "_-LAYER" "L" OLDCLAYER "CH" OLDCLAYER "") (setvar "attdia" OLDATTDIA) (setvar "attreq" OLDATTREQ) (setvar "OSMODE" OLDOSMODE) (setq *error* OLDERROR) (setvar "cmleaderstyle" OLDCMLEADERSTYLE) (setvar "luprec" OLDLUPREC) (setvar "auprec" OLDAUPREC) );defun (princ) ça ne marche pas au niveau de la réduction de la liste (ssdel...) il écrit plusieurs lignes de résultat avec meme calque et meme type de ligne, je ne comprends pas d'ou cela vient. si quelqu'un voit le souci de construction ou a une autre proposition de construction, je précise que je ne connais pas le VLISP. j'en profite pour souhaiter à tous une bonne année. Bien à vous
  7. @Olivier Eckmann Oui c'est exactement le sujet que je proposais à votre sagacité : comment stocker ces données pour que ce chemin soit simple et efficace? Mon premier message c'etait : Concernant le tableur excel, je l'ai mentionné dans un mail précédent, je préférais conserver mes données dans le dessin. A la réflexion, tu as peut être raison, si je colonne mes données, je les ouvre dans excel, ce sera peut être plus simple d'y voir les "trous" d'infos manquantes plutôt que de devoir récupérer les infos dans une procédure de contrôle. Je ne suis pas très à l'aise avec VBA dans excel, à voir si j'exporte directement depuis autocad ou excel vers le TXT. Merci pour ton retour, je vais monter un fichier exemple et je le posterai ici d'ici quelques jours, ça éclaircira peut être mon projet pour les tauliers.
  8. @didier Je n'ai pas de données dans Topstation, je traite de la Topo via Covadis dans AutoCAD et c'est une fois mon dessin fini que je veux pouvoir exporter quelques données dans Topstation, je ne fais pas d'aller retour. Je souhaite justement éviter de faire des traitements dans Topstation puisque je n'utilise presque pas ce logiciel.
  9. Bonjour @Olivier Eckmann Comme je dois exporter pas mal d'infos, je veux rester dans AutoCAD pour préparer l'export et réaliser avant export un contrôle de complétude sur les infos dans mes objets pour pouvoir les modifier en direct sans avoir à exporter, contrôler, puis revenir dans AutoCAD modifier. Cela me semble plus simple à priori de réaliser ce contrôle avec un programme LISP que d'aller le faire dans un logiciel que je ne maitrise pas une fois l'export réalisé mais comme je le disais, je réfléchis pour le moment à la méthodo, quand je rentrerai dans le dur ça bloquera peut être : "le diable est dans les détails". Les infos ne seront pas saisies par l'utilisateur, elles seront extraites des propriétés des objets (points, blocs, lignes, polylignes...).
  10. @didier Je ne dirai pas que c'est à la mode mais il y a une communauté active d'utilisateurs et le produit est effectivement basé sur ASCODES, il permet du développement et l'organisation des données est vraiment pas mal. Je sais que pas mal de sociétés ont aussi essayé des alternatives à Covadis depuis sa récente évolution tarifaire, est ce que cela leur donnera un coup de boost, je n'en sais rien. il y des développements récents d'applicatifs dédiés aux géomètres qui sont intéressants. Après, ce produit a effectivement la limite de sa "faible" diffusion, peu d'utilisateurs sont formés dessus et son utilisation est vraiment différente de Autocad. merci @(gile) pour ta réponse, je n'avais pas pensé à utiliser plusieurs fois le même code, ta biblio de fonctions a l'air top, je vais regarder cela. A voir.
  11. @didier Je te joins un exemple de fichier et le lien vers leur site : https://www.jsinfo.fr/logiciel-topstation c'est un logiciel de DAO assez répandu chez les géomètres. exemple_fichier_topstation.txt
  12. Bonjour @didier, Merci pour ta réponse, les éléments que je peux te donner pour l'instant : Oui, je veux prendre des objets autocad et construire le fichier TOPSTATION qui est un fichier TXT assez simple mais qui demande pas mal d'infos, d’où savoir où je les positionne dans autocad pour pouvoir les récupérer et les exporter. Oui j'avais ce fichier mais je ne le trouve pas aisé de lecture, j'avais un lien vers une page d'aide Autodesk 2018 je crois qui recensait les codes DXF que je trouvais plus aisée à lire. J'aurais du l'enregistrer. Pour l'instant je n'ai pas d'exemple, je suis en train de réfléchir à comment structurer mes données, comme il faut que je fasse une table de correspondance entre mes infos et celles que je dois écrire, je voulais avoir votre opinion sur l'endroit le plus adéquat où stocker ces données pour partir au plus efficace. Tu me conseilles le bloc à attributs, c'était ma première idée effectivement. Je vais voir si d'autres membres ont des suggestions identiques. Dès que j'aurai travaillé sur des données, je les publierai ici pour montrer ce que j'ai fait. c'est un travail assez important, ce ne sera pas tout de suite, je pense que je vais y passer quelques soirées des vacances. Ça marche nickel pour moi, ça fait exactement ce que je veux : j'immatricule les sommets d'une polyligne avec des blocs points et des MULTILEADER, puis j'importe des données que je digitalise sur le terrain, je les positionne à la main à proximité des sommets et ça transfère mes infos d'un bloc vers un autre puis l’identification du sommet vers le MULTILEADER , à la fin je supprime mes données importées. Bien à toi,
  13. Bonjour, Pour traiter un export depuis autocad vers topstation, je souhaite intégrer à mes objets autocad (blocs, lignes, polylignes, hachures) des données supplémentaires issues du levé codé, cela peut être des dimensions d'objet ou des données alphanumériques ou de numéros de points attachés à l'objet. dans un premier temps je pensais créer un gros bloc unique attaché à chaque objet avec la liste des attributs dont j'ai besoin mais en parcourant quelques sites web, j'ai vu que via les données étendues ou les dictionnaires, on pouvait aussi ajouter des données à un objet. De plus, attacher un bloc à une ligne par exemple, ça me parait "bourrin". J'ai essayé de faire avec des données étendues mais je ne comprends pas comment rajouter plusieurs info dans des paires différentes, j'ai l'impression qu'on est limité à quelques codes? les dictionnaires ont l'air plus large mais je voudrai savoir s'il y a des plages de codes DXF "libres" qu'on peut ajouter à la disposition des utilisateurs? J'avais également une référence WEB de l'aide Autodesk avec l'ensemble des codes DXF mais la page a disparu, savez vous si elle a été déplacée? Quelle stratégie pensez vous être la plus pertinente : bloc avec attributs? données étendues? Dicionnaires? J'ai vu dans un site web qu'on pouvait aussi attacher une base SQL ou des utilisateurs qui font pas mal d'import/export avec XLS, je préfèrerai conserver mes données dans le dessin. Merci d'avance pour vos réponses de lispeurs avertis,
  14. @Luna Bonjour, merci pour ta réponse, elle rejoint celle de Didier et règle mon souci. Pour les appels de nom, comme je parcours une selection pour chercher des blocs proches, tu proposes d'affecter d'abord le nom à une variable à chaque itération? il n'y a pas de fonction qui permet de parcourir une sélection comme "ENTNEXT" permet de parcourir les entités?
  15. A @didier Comme ton commentaire réglait le pb et que c'était une erreur basique (j'ai quand même un peu honte), je pensais pas que cela t’intéressait de poursuivre, pas de souci pour fournir mon fichier avec les blocs, je te le joins bien sur. j'ai des pbs d'encodage sur certains champs mais cela vient de mon appli terrain qui exporte mal, je suis en train de regarder cela. du coup je vais dupliquer ma boucle pour mettre à jour les MLEADER également, je ne l'ai pas encore fait. 20210618.dwg
  16. Bonjour @didier; A ma décharge, j'ai du suspendre mes développements depuis quelques mois et j'ai un peu de mal à raccrocher les wagons mais effectivement la boucle était pourrave et ça fonctionne maintenant, ce n'était pas du tout le retour de la fonction "setpropertyvalue" qui bloquait. Merci pour ton message, je demande de l'aide sur une commande, j'ai mal identifié le problème et ton commentaire me débloque, merci beaucoup. je te laisse le bout de code auquel cela correspond : (setq listsommets (ssget "_X" '((0 . "INSERT") (2 . "alp_bloc_fli_0201_pip_90"))) listgeoapp (ssget "_X" '((0 . "INSERT") (2 . "alp_bloc_fli_0202"))) listannot (ssget "_X" '((0 . "MULTILEADER") (8 . "FLI-T0" ))) i (sslength listgeoapp) ) ;code DXF c'est 10 pour les coordonnées ;code 110 pour le point d'insertion du MLEADER (while (ssname listgeoapp ( 1- i ) ) (setq PTGEOAPP (cdr (assoc 10 (entget (ssname listgeoapp (setq i (1- i)) ))))) ;coordonnées du pt d'insertion du bloc GEOAPP (repeat (setq j (sslength listsommets)) ;je parcours la liste des sommets pour identifier le sommet qui est à moins de 0.20m (setq PTSOMMET (cdr (assoc 10 (entget (ssname listsommets (setq j (1- j)) ))))) (if (< (distance PTGEOAPP PTSOMMET) 0.20) ;je dois remplacer les attributs OBS1 à OBS9 de PTGEOAPP vers PTSOMMET (progn (setq k 1) (repeat 9 (setpropertyvalue (ssname listsommets j) (strcat "OBS" (itoa k) ) (getpropertyvalue (ssname listgeoapp i ) (strcat "OBS" (itoa k) ) ) ) (setq k (1+ k)) );repeat );progn );if );while j );while i j’insère à partir de fichiers externes des données dans autocad et il faut que je transfère des infos ensuite d'un bloc vers un autre inséré précédemment puis vers un MLEADER. ces infos sont dans des attributs qui s'appellent OBS1, OBS2, OBS3... dans les différents blocs. Bien à toi,
  17. Bonjour, Je fais une boucle pour modifier des attributs OBS1 à OBS9 d'un bloc vers un autre avec un repeat : (repeat 9 (setq k 1) (setpropertyvalue (ssname listsommets j) (strcat "OBS" (itoa k) ) (getpropertyvalue (ssname listgeoapp i ) (strcat "OBS" (itoa k) ) ) ) (setq k (1+ k)) );repeat Je comprends que quand il lance la première modification, setpropertyvalue retourne nil ce qui bloque la boucle. y a t il un moyen de shunter ce retour nil? Merci d'avance.
  18. Bonjour, j'avais travaillé sur un sujet comme cela et je passais à chaque sommet un test d'existence de point par proximité, je ne sais pas comment référencer une discussion dans une autre, si tu cherches mes messages, tu trouveras une routine de test qui devrait te convenir.
  19. Bonjour, il n'y a pas de règle formelle, en matière d'appartement si tu parles d'un certificat de superficie privative, il y a 5% de tolérance mais ce n'est que dans le cas d'une copropriété, en l'absence, c'est en fonction des moyens qu'aura mis le géomètre pour respecter son cahier des charges s'il précise dans son offre la classe de précision qu'il propose. En l'absence d'une telle mention, je ne vois pas de tolérance "règlementaire".
  20. Merci pour cet envoi, je vais regarder cela, tout un monde de fonctions qui s'ouvre à moi, la compréhension du fonctionnement n'est pas aisée pour un novice, le factoriel c'est tellement simple que ca en est un peu trivial alors que l'application aux autres fonctions est pas évidente.
  21. Bonjour, Je te remercie pour ce retour, je vais tester ca, ca simplifie énormément, je débute, je patauge un peu. Il y a un point que je ne comprends pas dans les fonctions et j'avais vu ca dans pas mal d'exemples de routines, quand tu définis la fonction entre des bornes 'defun', comment tu peux utiliser cette fonction 'dans elle même' en quelque sorte?
  22. Bonjour, Je n'ai pas réussi à utiliser ta routine, j'ai retravaillé de mon côté en construisant la liste des positions dans la liste que je parcours des points que je recherche en fonction d'une distance fixe, puis à partir de cette liste de positions je reconstruis ma liste de points en ayant exclu ceux qui sont à moins de 0.02m des existants. ca a l'air plus bourrin mais ca fonctionne, je te mets la routine : ;il faut que je compare la liste 's' des blocs dans le calque PIP-90 et la liste-sommets de la polyligne listpts (setq s (ssget "_X" '((0 . "INSERT") (8 . "PIP-90"))) ind1 0 entl '() listpt '() ) (if (/= nil s) (progn (repeat (sslength s) (setq coordbloc (list (car (cdr (assoc 10 (entget (ssname s ind1 ))))) (cadr (cdr (assoc 10 (entget (ssname s ind1)))))) ind1 (1+ ind1) ind2 0 );setq (repeat (length listpts) (if (< (distance coordbloc (nth ind2 listpts) ) 0.02) ;je veux rechercher les points qui sont à moins de 2 cm des 'coordbloc' existants (setq entl (cons ind2 entl)) ;je construis la liste des indices de points communs pour ensuite les supprimer dans 'listpts' );if (setq ind2 (1+ ind2) ) );repeat );repeat (setq i 0 n 0 ) (repeat (- (length listpts) 1 ) ;je veux construire la liste 'listpt' en insérant chacun des éléments de 'listpts' sauf ceux qui sont dans la liste 'entl' (if ( /= i (nth n entl) ) (setq listpt (cons (nth i listpts) listpt ) i (1+ i) ) ) (if ( = i (nth n entl)) (setq n (1+ n) i (1+ i) ) ) );repeat (setq listpts (reverse listpt ) ) );progn );if Je ne suis pas trop sur de la seconde boucle 'repeat' avec les deux 'if' qui se succèdent, j'avais essayé avec mapcar qui me semblait adapté mais je n'ai pas réussi à écrire quelquechose qui tourne.
  23. Bonjour, Pour la routine c'est cela : sauf que la polyligne je la crée puisque c'est une reconstitution de contour et sur ce contour je veux insérer un bloc POINT à chaque sommet, sauf s'il en existe déjà un. Pour l'attribut ALT, je ne m'en occupe pas, je travaille en 2D. Je réalise la sélection de tous les blocs ayant un attribut MAT avec la routine de GILE (setq s (ssget "_X" '((0 . "INSERT") (66 . 1)))) (repeat (setq i (sslength s)) (setq b (ssname s (setq i (1- i)))) (if (vl-catch-all-error-p (vl-catch-all-apply 'getpropertyvalue (list b "MAT")) ) (ssdel b s) );if );repeat puis je liste les sommets de la polyligne sur lesquels je souhaite ajouter des blocs : (setq ptinser (getpoint "\nCliquez dans le contour à immatriculer:")) (command-s "-contour" ptinser "") (setq nompoly (cdr (assoc -1 (entget (entlast))))) (setq liste-sommets '() ent-liste (entget nompoly) n 0) (repeat (length ent-liste) (if (= 10 (car (nth n ent-liste))) (setq liste-sommets (cons (cdr (nth n ent-liste)) liste-sommets)) );if (setq n (1+ n)) );repeat (setq liste-sommets (reverse liste-sommets)) et je veux ensuite réaliser ma routine de suppression de "liste-sommets" en enlevant les points du jeu de sélection "s" s'ils existent dans les deux. "s" est un jeu de sélection de blocs "liste-sommets" est une liste de type: Commande: !liste-sommets ((935.077 180.848) (905.821 188.627) (888.46 170.264) (904.042 159.066) (924.398 148.397)) la polyligne est bien LWPOLYLINE Espérant avoir été assez clair, peux tu m'expliquer s'il y a une différence à parcourir la liste DXF ou à utiliser "getpropertyvalue"?
  24. Bonsoir, je reviens avec ma liste de points en fonction des attributs, une fois que j'ai la sélection des blocs avec un attribut MAT, je souhaite insérer un point sur chaque sommet mais avant je souhaite vérifier qu'il n'y a pas déja de points sur les sommets, donc à partir de la sélection s des points avec un attribut MAT, je la parcours pour vérifier que les sommets de la polyligne "listpts" n'existent pas et je veux supprimer ces points de "lispts" pour ensuite insérer les points uniquement sur les sommets restants. je comprends pas ce qui bug dans mon traitement : (repeat (sslength s) (setq coordbloc (list (getpropertyvalue (ssname s ind1) "Position/X") (getpropertyvalue (ssname s ind1) "Position/Y") ) ) ;je parcours les points avec MAT pour construire leurs coordonnées (setq ind1 (1+ ind1) ) (vl-remove coordbloc listpts ) ;je supprime l'entité de la liste des sommets );repeat
  25. Bonsoir, Merci pour la routine, ca marche nickel, du coup j'ai ajouté une seconde boucle derrière pour rechercher le max des attributs et ça roule, ça m'a permis de découvrir le "getpropertyvalue" qui est terrible pour récupérer des infos. ;j'ai un jeu de sélection s avec tous les blocs dont l'attribut est MAT ;je dois rechercher les valeurs de ces attributs puis en chercher le max (setq i 0 maxlist 0) (repeat (sslength s) (setq matr (atoi (getpropertyvalue (ssname s i) "MAT"));je récupère les valeurs des matricules i (1+ i) listmat (cons matr listmat) ;je construis la liste des tous les matricules ) (if (> matr maxlist);je recherche la valeur max des attributs (setq maxlist matr) );if );repeat
×
×
  • 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é