lovecraft Posté(e) le 17 septembre 2010 Posté(e) le 17 septembre 2010 Bonsoir, Je recherche une méthode pour extrait une partie d'une chaîne de texte. je m'explique: j'aimerai une fonction ou la méthode qui me retour une partie d'une chaine de texte exemple: je sélectionne un objet je récupère le nom du calque(ex:BATI_HACH) "jusqu'ici je sais faire" par contre j'aimerai récupérer la chaîne qui se situe après "_" pour obtenir HACH. Voilà j'espère que j'ai été assez clair. Merci de votre aide cordialement, Laurent http://www.youtube.com/user/CADMINATOR?feature=mhee
couçicouça Posté(e) le 17 septembre 2010 Posté(e) le 17 septembre 2010 salut tu as la fonction substr substr "chaine" n m n est le début de la recherche dans la chainem est le nombre de caractères depuis n à recopier (m est facultatif) ex Command: (substr "abcde" 2) "bcde"Command: (substr "abcde" 2 1) "b"Command: (substr "abcde" 3 2) "cd"
lovecraft Posté(e) le 17 septembre 2010 Auteur Posté(e) le 17 septembre 2010 Bonsoir couçicouça, Effectivement j'y avais pensé mais cela ne correspond pas à ce que je recherche.ou peut être dans une seconde étape. en fait j'aimerai trouver la position d'un caractère dans une chaîne de texte Exemple:trouver _ dans POINT_TN retourne 5trouver - dans BATI-HACH retourne 4 ect.... Merci de votre aide laurent http://www.youtube.com/user/CADMINATOR?feature=mhee
(gile) Posté(e) le 17 septembre 2010 Posté(e) le 17 septembre 2010 Salut, substr est effectivement une partie de ce que tu cherches, l'autre étant vl-string-position ou vl-string-search (les 2 sont utilisables dans ton cas). Curieusement en AutoLISP substr est indexée à partir de 1 (0 pour les fonctions équivalentes dans la plupart des autres langages de programmation) et vl-string-position ou vl-string-search le sont à partir de 0. L'index à passer à substr est donc celui retourné par vl-string-position ou vl-string-search + 2. (setq str "POINT_TN") (substr str (+ 2 (vl-string-position (ascii "_") str)))ou(substr str (+ 2 (vl-string-search "_" str))) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
couçicouça Posté(e) le 17 septembre 2010 Posté(e) le 17 septembre 2010 quelque chose comme ça ? (defun trouve (chaine carac / n ch ca) (setq n 1) (while (<= n (strlen chaine)) (setq ca (substr chaine n 1)) (if (= ca carac) (setq ch (substr chaine (1+ n)) n (1+ (strlen chaine)) ) (setq n (1+ n)) ) ) (if ch ch (strcat "pas de " carac " trouvé") ) ) (trouve "BATI-HACH" "-") 1er argument : ta chaine à analyser2eme argument : le caractere à isoler le tout te renvoie "HACH"
lovecraft Posté(e) le 18 septembre 2010 Auteur Posté(e) le 18 septembre 2010 Bonjour, Tout d'abord merci à vous deux. donc voici le p'tit code que je voulais faire: (defun c:test() (while (setq str (entget (car (nentsel)))) (setq chaine (cdr (assoc 8 str))) (setq val_txt (strcat "*" (substr chaine (+ 2 (vl-string-position (ascii "|") chaine))))) (command "-calque" "g" Val_txt "") );fin du while );fin du defun Le but de ce code c'est de pouvoir geler dans plusieurs Xref un calque pourtant le même Nom. Il fonctionne pas trop mal en l'état, mais je suis confronté à une problème. C'est que lorsque je clique sur un bloc ma routine ne remonter pas le calque d'insertion du bloc mais celui de l'entité donc le calque "0" Voilà Merci de vos lumière... Laurent http://www.youtube.com/user/CADMINATOR?feature=mhee
Carboleum Posté(e) le 18 septembre 2010 Posté(e) le 18 septembre 2010 hello! entsel à la place de nentsel Carboléüm, qui dessine aussi à la main -> Carboleum's sketchblog
(gile) Posté(e) le 18 septembre 2010 Posté(e) le 18 septembre 2010 Salut, sur une "entité complexe" (référence de bloc, polyligne 2d ou 3d, maillage), l'expression (car (nentsel)) retourne le nom d'entité de la sous-entité sélectionnée. Dans le cas de blocs imbriqués (bloc dans une xref par exemple) c'est le nom d'entité de l'entité simple la plus profondément imbriquée qui est retournée. Une solution consiste à utiliser la liste retournée par nentsel sur une entité complexe :- premier élément : ename de la sous entité sélectionnée- deuxième élément : point cliqué (coordonnées SCU courant)- troisième élément : matrice de transformation de l'objet (combinaison des différentes transformations subies à chaque insertion)- quatrième élément : liste des enames des objets parents (du plus imbriqué à l'objet inséré dans l'espace courant). C'est ce quatrième élément qui nous intéresse. C'est le dernier de la liste retournée par nentsel, on y accède donc par :(setq nent (nentsel) parents (last nent) )Dans le cas d'un bloc inséré dans une xref, elle même insérée dans l'espace courant, le dernier élément de parents est le nom d'entité de la xref, l'avant dernier celui de la référence de bloc insérée dans la xref (si cette liste a plus de 2 éléments c'est que ce bloc contient un ou plusieurs blocs imbriqués dont le premier de la liste contient l'entité sélectionnée). Pour ton code, il faut donc faire :(while (setq nent (nentsel)) ...)pour récupérer la liste nentsel complète, puis évaluer si l'entité sélectionnée est une entité simple dans l'espace courant (liste équivalente à celle retournée par entsel) une entité simple dans une xref (ou une référence de bloc) ou une entité composant d'un bloc imbriqué :(if (or (= 2 (length nent)) ;_ dans l'espace courant (= 1 (length (last nent))) ;_ premier niveau d'imbrication dans une référence ) (setq chaine (cdr (assoc 8 (entget (car nent))))) (setq elst (cdr (assoc 8 (entget (cadr (reverse (last nent))))))) ;_ niveau d'imbrication plus profond ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lovecraft Posté(e) le 21 octobre 2010 Auteur Posté(e) le 21 octobre 2010 Bonsoir, Merci Gile pour les explication et le code. Donc voici ce que cela donne au final. cette routine permet de geler des calques ayant le même nom dans plusieurs Xref. (defun c:GXREF() (while (setq nent (nentsel)) (if (or (= 2 (length nent)) ;_ dans l'espace courant (= 1 (length (last nent))) ;_ premier niveau d'imbrication dans une référence ) (progn (setq chaine (cdr (assoc 8 (entget (car nent))))) (setq val_txt (strcat "*" (substr chaine (+ 2 (vl-string-position (ascii "|") chaine))))) ) (progn (setq elst (cdr (assoc 8 (entget (cadr (reverse (last nent))))))) (setq val_txt (strcat "*" (substr elst (+ 2 (vl-string-position (ascii "|") elst))))) ) ;_ niveau d'imbrication plus profond );fin du if (command "-calque" "g" Val_txt "") );fin du while );fin du defun Cordialement, Laurent http://www.youtube.com/user/CADMINATOR?feature=mhee
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