-
Compteur de contenus
5 029 -
Inscription
-
Dernière visite
-
Jours gagnés
56
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par bonuscad
-
Extrait de l'aide ATTEDIT: Donc il te faut te tourner vers une procédure.... :exclam:
-
Chargement de lisp au démarrage
bonuscad a répondu à un(e) sujet de Ramses dans Pour aller plus loin en LISP
Pour la version 2000-2002. Le chargement et l'initialisation automatique des ExpressTools se fait par le fichier "acettest.fas" (fichier lisp compilé) qui se trouve dans le dossier "Support" d'AutoCad. Je ne sais pas si le principe est le même pour les versions suivantes. Ce qui a dedans reste un mystère. :casstet: -
Juste un petit soucis à la 1ère utilisation, ça avorte Je pense que c'est une variable qui n'est pas définies lors de la 1ère utilisation, mais qui le devient après cet échec. Donc pas bien grave (juste pour l'esthétique d'utilisation). Pas d'autres observations, ça fonctionne Nickel, il ne manque plus que les Chromes ;)
-
Filtre avec test relationnels
bonuscad a répondu à un(e) sujet de bonuscad dans Pour aller plus loin en LISP
Des "Booles" ou des "Bulles" :) (gile) tu pourrais donner ta réponse ICI L'origine de ma question vient de là! Mais vu les problèmes avec le caractère ">" et "<" aussi sur ce forum, et mon niveau d'Anglais, je l'ai reposé ici pour ma culture personnelle. Oui, mais je n'y avais pas pensé! Donc merci pour ta soluce. -
Filtre avec test relationnels
bonuscad a répondu à un(e) sujet de bonuscad dans Pour aller plus loin en LISP
Hop, de même: "Tout mes voeux à tous !" Désolé Patrick_35, ne fonctionne pas mieux que ma proposition. (gile) me conforte dans mon analyse Bizzare tout de même qu'AutoDesk ait occulté cette posibilité. Mais bon, ils ont bien occulté les données des "3DSOLID" en faisant un décalage de bit. Mais ta solution par énumération fonctionne bien, faute de pouvoir faire plus court. ;) -
Bonjour, Crée des régions dans ton dessin. Le code est sommaire et il ne vérifie pas si le jeu de sélection est vide. Ce qui doit être le cas pour toi, d'où le message d'erreur sur une sélection vide. la variable ssel2 se retrouve à "nil" (rien, vide) et bloque pour la suite.
-
Le but de la ligne suivante serait de sélectionner les cotations angulaire de tout le dessin. (ssget "_X" '((0 . "DIMENSION") (-4 . "< OR") (-4 . "&=") (70 . 2) (-4 . "&=") (70 . 5) (-4 . "OR >" ))) Or celui ci ne fonctionne pas de manière attendu. Dans la sélection il m'inclu les cotations diamètre et ordonnée. Soit je ne comprends pas l'usage de "&=" ou soit les opérations boléennes sur le code 70 ne peuvent s'appliquer. Je trouves que les valeurs du bit 70 de la cotation sont étranges et ne correspondent pas à d'autre bit de controle (par exemple le code 70 des polylignes), ou l'on fait la somme des bits. Si on applique la même régle un code (70 . 3) devrait représenter 2=angulaire et 1=Alignée or il représente 3=Diamètre Ma question: Comment faire un test boléen efficace dans ce cas. Je perds la "Boole" ;) NB:enlever les espaces existants entre les guillemets dans les chaines "OR" pour tester.
-
Je viens de vérifier, tu peux trouver les routines ICI Dans le zip tu récupères les 2 fichiers lsp "TRF2DWG.LSP" et "GERE-TRF.LSP" Dans un nouveau dessin tu utilise Trf2Dwg pour importer la définition du projet piste. Puis Gere-Trf pour la gestion. Ce module, comme je l'ai dit, est inachevé. Je me suis contenté de réaliser surtout la gestion des profils en travers. Ca n'a pas la prétention de remplacer un logiciel de conception. ;)
-
Bonjour, Je vais répondre peut être à coté, mais voici ce que je peux te proposer: Je travaille avec piste V4.10 Avec ce module j'exporte au format TRF (version 3.0) Ce fichier a l'extension TRF, je l'intégre dans Autocad avec une routine Lisp. Je récupère donc au format DWG la définition 2D de l'axe en plan et le transfert des profils en travers positionnés en 3D (avec donc la récupération des coupe par profils et non par interpolation, si ceux ci ont été importés de cettte manière dans piste). Une autre routine me permet de gérer cet import (Axe en plan/Profil en long/Profil en travers) Le module profil en travers me permet de recoter automatiquement mon profil en travers si une ligne TN ou Projet/Plateforme/Base est modifié (pedit ou grip sur polyligne) Donc si cette solution ponctuelle t'interresse, je peux mettre le code en ligne. NB:Je ne l'ai jamais achevé (cotation du profil en long absente)
-
Hé oui encore moi avec mes splines/Elipses
bonuscad a répondu à un(e) sujet de néné dans AutoCAD 2005
Salut Le même remanié pour travailler sur TOUTES les SPLINE et ELLIPSE du dessin. Options Diviser ou Mesurer rajoutées. (defun C:S-E2PL ( / js n ent typent dxf_ent obj_vlax param_start param_end perim_obj pt_start pt_end res_track res_divid flag_ucs flag_erase last_e old_osmd old_pdmd l_pt) (setq js (ssget "_X" '((0 . "SPLINE,ELLIPSE")))) (cond (js (vl-load-com) (initget "Mesurer Diviser _Measure Divide") (if (eq (getkword "\nAction par [Mesurer/Diviser]? < Mesurer >: ") "Divide") (progn (initget 7) (setq res_divid (getint "\nNombre de division: ")) ) (progn (initget 7) (setq res_track (getdist "\nDistance de résolution: ")) ) ) (setq old_osmd (getvar "osmode") old_pdmd (getvar "pdmode") n -1 ) (initget "Oui Non _Yes No") (if (eq (getkword "\nVoulez vous faire une projection sur le SCU courant? [Oui/Non] < Non >: ") "Yes") (setq flag_ucs nil) (setq flag_ucs T) ) (initget "Oui Non _Yes No") (if (not (eq (getkword "\nEffacer l'entité source [Oui/Non] < Oui >: ") "No")) (setq flag_erase T) (setq flag_erase nil) ) (setvar "osmode" 0) (setvar "pdmode" 1) (setvar "cmdecho" 0) (repeat (sslength js) (setq ent (ssname js (setq n (1+ n))) obj_vlax (vlax-ename->vla-object ent) param_start (vlax-curve-getStartParam obj_vlax) param_end (vlax-curve-getEndParam obj_vlax) perim_obj (vlax-curve-getDistAtParam obj_vlax (+ param_start param_end)) pt_start (vlax-curve-getStartPoint obj_vlax) pt_end (vlax-curve-getEndPoint obj_vlax) last_e (entlast) ) (if res_divid (setq res_track (/ perim_obj res_divid))) (if flag_ucs (command "_.ucs" "_entity" ent)) (cond ((and (eq typent "SPLINE") (not (zerop (boole 1 1 (cdr (assoc 70 dxf_ent)))))) (setq l_pt '("_close")) ) ((and (eq typent "ELLIPSE") (zerop (cdr (assoc 41 dxf_ent))) (eq (cdr (assoc 42 dxf_ent)) (* 2 pi))) (setq l_pt '("_close")) ) (T (setq l_pt (cons (trans pt_end 0 1) '(""))) ) ) (command "_.measure" ent res_track) (while (and (= (cdr (assoc 0 (setq dxf_ent (entget (entlast))))) "POINT") (not (equal (entlast) last_e)) ) (setq l_pt (cons (trans (cdr (assoc 10 dxf_ent)) 0 1) l_pt)) (entdel (entlast)) ) (command "_.pline" (mapcar 'command (cons (trans pt_start 0 1) l_pt))) (if flag_ucs (command "_.ucs" "_previous")) (if flag_erase (entdel ent)) ) (setvar "osmode" old_osmd) (setvar "pdmode" old_pdmd) (setvar "cmdecho" 1) ) (T (princ "\nAucune Spline ou Ellipse trouvée!")) ) (prin1) ) (princ "\nS-E2PL.LSP chargé. Tapez S-E2PL pour convertir SPLINE ou ELLIPSE en POLYLIGNE.") (prin1) -
Je ne sais pas si ma réponse va éclairer le pourquoi du comment. Serge avait parlé ici ou ailleurs, je ne sais plus où, d'un problème (si mes souvenir sont bons). Je crois qu'il parlait de par exemple de l'appel de commande AutoCAD à travers (command), appel basique et par exemple (vl-cmdf) qui peuvent sembler identiques mais diffère selon leur priorité d'évaluation. Il semblerait que (vl-cmdf) puisse avoir des latences de retour de commande, celui-ci ne rendrait pas forcément la main même si le cycle de la commande est terminée. Ce qui peut être ennuyeux. Cette réponse est faite sur un vague souvenir de posts anciens..... propos à vérifier ;)
-
Une nouvelle proposition, (celle ci ne tiens plus compte de ton histoire d'erreur d'altidude sur une fourchette de code inférieur à 1000) Lors de l'utilisation un paramètrage va avoir lieu sur la 1ere boucle pour définir la position de ton code puis numéro et enfin l'altidude par rapport à ton point. Ceci fait, chaque point sera (normalement) transferé dans le calque portant le nom du code (nombre entier) avec son code et son altitude. Les chevauchements des écritures ne devraient pas poser de problème. J'espère qu'elle va t'apporter la réponse attendue sans avoir besoin d'être remanié ou ajusté. (defun tri_sel (sel l en p_o / n tri_sel e_text dxf_txt pins val) (setq n 0 tri_sel (ssadd) tri_sel (ssadd en tri_sel) ) (repeat (sslength sel) (setq e_text (ssname sel n) dxf_txt (entget e_text) pins (cdr (assoc 10 dxf_txt)) pins (list (car pins) (cadr pins) 0.0) val (cdr (assoc 1 dxf_txt)) ) (cond ((equal (mapcar '- pins p_o) (car l) 0.0001) (setq tri_sel (ssadd e_text tri_sel)) ) ((equal (mapcar '- pins p_o) (cadr l) 0.0001) (setq tri_sel (ssadd e_text tri_sel)) ) ((equal (mapcar '- pins p_o) (caddr l) 0.0001) (setq tri_sel (ssadd e_text tri_sel)) (command "_.-layer" "_new" (itoa (read val)) "") (setvar "CLAYER" (itoa (read val))) ) ) (setq n (1+ n)) ) (command "_.change" tri_sel "" "_properties" "_layer" (getvar "CLAYER") "") (setvar "CLAYER" "0") ) (defun C:Tri_pt ( / j_sel lst_ins lst_box n ent pt_ins e_text txt_box pt c1 c2 js) (setvar "cmdecho" 0) (setvar "osmode" 0) (command "_.zoom" "_extent") (setq j_sel (ssget "_x" ' ((0 . "POINT")))) (setq lst_ins '() lst_box '()) (cond (j_sel (setq n 0) (repeat (sslength j_sel) (setq ent (ssname j_sel n) pt_ins (cdr (assoc 10 (entget ent))) pt_ins (list (car pt_ins) (cadr pt_ins) 0.0) ) (if (zerop n) (progn (command "_.zoom" "_ce" pt_ins "10.0") (princ "\nEtalonnage de position des textes pour code/numéro/texte-z.") (foreach msg '("code" "altitude");'("code" "numero" "altitude") (initget 1) (setq e_text (entget (car (nentselp (getpoint pt_ins (strcat "\nChoix tu texte pour la valeur " msg ": "))))) txt_box (textbox e_text) pt (cdr (assoc 10 e_text)) pt (list (car pt) (cadr pt) 0.0) lst_ins (cons (mapcar '- pt pt_ins) lst_ins) lst_box (append (mapcar '(lambda (x) (mapcar '+ (car lst_ins) x)) txt_box) lst_box) ) ) (command "_.zoom" "_previous") ) ) (setq c1 (list (+ (car pt_ins) (eval (cons 'min (mapcar 'car lst_box)))) (+ (cadr pt_ins) (eval (cons 'min (mapcar 'cadr lst_box)))) 0.0 ) ) (setq c2 (list (+ (car pt_ins) (eval (cons 'max (mapcar 'car lst_box)))) (+ (cadr pt_ins) (eval (cons 'max (mapcar 'cadr lst_box)))) 0.0 ) ) (setq js (ssget "_c" c1 c2 '((0 . "TEXT")))) (if js (tri_sel js lst_ins ent pt_ins)) (setq n (+ 1 n)) ) ) ) )
-
Cela voudrait-il dire que les points sousmis à ssget sont incorrects? Tu as peut être modifié C1 ou C2 incorrectement? Si tu n'y arrives pas poste le code.
-
Tiens ce sujet m'amène à une autre question :P Comment monter un filtre qui ne sélectionne que les groupes? Ben tiens, en voilà une question!... ;)
-
Oui, mais n'oublie pas que les parenthèse sont appariées. Donc il manque la parenthèse fermante du (if et du (progn. Elles sont après la ligne (command "_.change............)
-
Salut, Je te propose celui-ci, mais qui demande de sélectionner un groupe (donc 1 par 1) Essayes de le modifier pour faire tous les groupes! A moins qu'il y ait d'autre proposition. (defun c:degroup ( / ent dxf_ent dxf_def dxf_grp lst lst_name_gr ent_grp) (while (null (setq ent (entsel)))) (setq dxf_ent (entget (car ent))) (setq dxf_def (entget (cdr (assoc 330 dxf_ent)))) (cond ((eq (cdr (assoc 100 dxf_def)) "AcDbGroup") (setq dxf_grp (dictsearch (namedobjdict) "ACAD_GROUP") lst (member (cons 350 (cdar dxf_def)) (reverse dxf_grp)) nam_gr (list (cadr lst) (car lst)) ent_grp (dictsearch (cdr (assoc -1 dxf_grp)) (cdar nam_gr)) ) (entdel (cdar ent_grp)) (princ "\nEntités dégroupées") ) (T (princ "\nEntité non groupée") ) ) (princ) )
-
Les wild-card comme décrit dans (wcmatch) sont effectivement le seul moyen de faire des filtres sur les CHAINES de caractères pour (ssget). Les test sur entier et réel se faisant avec les opérateur relationnel comme dans les exemples de Gilles
-
Moi je pensais que c'était pour avoir ses 20000 inscrit avant fin 2005, ça fait bien comme bilan de fin d'année ;) Ouais cela pourrait être plaisant, pas une "Garden Party" pour VIP italique= humour, comme dirait Christian! ;) Plus sérieusement, ce qui me gêne un peut c'est le temps de validité en mode connecté (sans activité) que je trouve un peu court. Cela oblige à se reconnecter fréquemment rien que pour lire. Vive Cad XXXP (normal, il prend de l'envergure)
-
En arpaté En mode capture c'est astuce est interressante quand on veut pouvoir sélectionner plusieurs entités superposées, ce que ne peut faire (ssget) en mode point unique.
-
Oops, cliqué trop vite, tu peux fournir un point à SSGET (ssget (list (list x y z))) Mais dans le cas de texte je te déconseille ce procédé, car ton jeux de sélection a de forte chance d'être vide. En effer une lettre ou chiffre du texte ne commencera pas forcément pile poil au point d'insertion. C'est pour ça que j'ai choisi le mode capture qui est plus sûr, par contre si les informations son rapproché d'un point à l'autre, c'est vrai qu'il y aura des sélections trop expansive. Essaye d'ajuster aux mieux C1 et C2 (point de capture) Les points fourni a (ssget) te donne le même comportement que lorsque tu fait tes sélections manuellement (d'ailleurs le mode acrobj peut avoir une influence dans ce style de ssget, et je ne m'en suis pas préoccupé dans l'ébauche du code, il faudrait....) Cela reste du bidouillage, et dans l'urgence dans laquelle tu te trouves, cela riques de faire de grosses coquilles. Je pourrais faire un truc plus sophistiqué et plus fiable, mais ton besoin est trop particulier et ponctuel pourque cela vaille la peine d'investir du temps. Mon idée quand même serait de controler les point d'insertion des texte selectionnés pour voir s'ils sont associer au point. Ca fait du code .... ;) [Edité le 16/12/2005 par bonuscad] [Edité le 16/12/2005 par bonuscad]
-
Fraid Une ébauche rapide C'est très sommaire, il faudra certainement ajuster beaucoup de choses. Mais cela te donne la direction principale (defun C:Tri_pt ( / ) (setq j_sel (ssget "_x" ' ((0 . "POINT")))) (setq n 0) (repeat (sslength j_sel) (setq ent (ssname j_sel n)) (setq pt_ins (cdr (assoc 10 (entget ent)))) (setq c1 (list (+ (car pt_ins) 0.05) (+ (cadr pt_ins) 0.1) (caddr pt_ins))) (setq c2 (list (+ (car pt_ins) 0.1) (+ (cadr pt_ins) 0.2) (caddr pt_ins))) (setq js (ssget "_c" c1 c2 '((0 . "TEXT")))) (cond (js (setq cod (read (cdr (assoc 1 (entget (ssname js 0)))))) (if (and (eq (type cod) 'INT) (< cod 1000)) (progn (command "_.-layer" "_new" (itoa cod) "" "") (command "_.change" (ssget "_c" c1 (list (+ (car pt_ins) 0.05) (- (cadr pt_ins) 0.1) (caddr pt_ins))) "" "_properties" "_layer" (itoa cod) "") ) ) ) ) (setq n (+ 1 n)) ) ) NB: Si les points sont proches et que des textes se chevauchent cela risque d'être galère. :casstet:
-
Est ce que ton code et ton numéro peuvent se différencier par la couleur par exemple. (ou à la limite par le nombre de chiffre, millier pour l'un, centaine pour l'autre) Si oui cela peut être réalisable, si non, je ne vois pas comment différencier le code ou le numéro qui sont je suppose des entiers. Sans vouloir te décourager, je crois que tu vas être un peu "SHORT", surtout avec les problèmes que tu rencontres. [Edité le 15/12/2005 par bonuscad]
-
blocage à l\'ouverture du fichier.
bonuscad a répondu à un(e) sujet de guerin dans AutoCAD 2000 à 2002
Le fichier de sauvegarde automatique (si activée) ".SV$", mais vu les tentatives que tu a fais, il est peut être perdu. Le fichier de sauvegarde (n -1) ".BAK" à renommer en ".DWG" (c'est mieux que rien) L'insertion en bloc, tu as essayé avec l'option "décomposé" ? Pour info, j'ai eu le même souci avec un dessin qui possédait des liens OLE. (fait par moi) et sauvegarder sans erreur. Impossible de le réouvrir de quelque manière que ce soit sur mon poste. Sur un autre poste, j'ai pu l'ouvrir avec quelque difficulté, mais j'ai quand même pus le sauvegarder et il est redevenu lisible sur mon poste. Peut être a tenté si tu peux faire cette manip. -
Creation d<un type de ligne personalisé
bonuscad a répondu à un(e) sujet de gooloom dans AutoCAD 2004
El ligne de commande AutoCAD tape "COMPILER" (_COMPILE) tu sélectionne ton fichier source SHP et ton SHX est crée. Pour les type de ligne, je te ferais un copier-coller de l'aide donc, consulte la Documentation du développeur, section "Guide de paersonnalisation". L'aide est bien faite. Je te propose de la consulter et de revenir pour poser une question plus précise sur un point qui te resterait difficile à comprendre. -
Le code de Tramber avec un test sur la valeur (doit être un réel) (defun c:ch10() (setvar "dimzin" 0) (setq sel (ssget '((0 . "TEXT")))) (setq cont 0) (repeat(sslength sel) (setq ent(vlax-ename->vla-object (ssname sel cont))) (if(and(>=(atof(vla-get-textstring ent))200)(<=(atof(vla-get-textstring ent))300)) (progn (setq ed (entget (ssname sel cont))) (if (eq (type (read (cdr (assoc 1 ed)))) 'REAL) (progn (setq ed(subst(cons 1(VL-PRINC-TO-STRING(rtos (+ 10(atof(vla-get-textstring ent))) 2 3)))(assoc 1 ed)ed)) (entmod ed))))) (setq cont(1+ cont)) ) ) [Edité le 15/12/2005 par bonuscad]
