-
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
-
activer une barre d\'outil par selection d\'une fenetre
bonuscad a répondu à un(e) sujet de irtxp dans AutoCAD LT 2004
Salut, Pourtant tu es sur la bonne voie Voici un exemple avec CTAB qui tracera un cercle si présentation A4 ou A4 une ligne autrment. ^C^C$M=$(if,$(or,$(eq,$(getvar,ctab),"A4"),$(eq,$(getvar,ctab),"A3")),cercle,ligne) -
Salut, Toujours avec Bonuscad (zone de téléchargement) tu récupère la routine topo.lsp et le DCL associé (topo.dcl) Sous Excel tu enregistre en mode texte (dans un nouveau fichier de préférence), et tu fais lire ce fichier par la routine. NB: prendre de préférence sous excel, les espaces comme séparateurs.
-
Aller plus loin avec ENTMAKE
bonuscad a répondu à un(e) sujet de Tramber dans Pour aller plus loin en LISP
Tramber, Il n'est pas possible de mixer les 2 mode de création (entmake) et (command). Entmake crée un fichier de définition tamporaire qui sera validé lors de l'instruction (entmake '((0 . "ENDBLK"))). Donc durant cette période, seul entmake est abilité pour ajouter des définitions. La seule astuce possible est de récupérer l'entité crée par un (entget) de la supprimer par un (entdel) et de la recréer par (entmake) à l'aide de la liste retourné par enget, ceci au bon endroit bien sur. -
Aller plus loin avec ENTMAKE
bonuscad a répondu à un(e) sujet de Tramber dans Pour aller plus loin en LISP
Serge, Une particularité de ENTMAKE et qu'il peut créer le calque même si celui ci n'existe pas. Ex. cette instruction va créer une ligne sur le plan TOTO même si celui ci est inexistant. (entmake '((0 . "LINE") (5 . "2B") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "TOTO") (100 . "AcDbLine") (10 118.753 129.067 0.0) (11 264.238 186.718 0.0) (210 0.0 0.0 1.0))) Ce qu'il faut c'est que le nom du calque soit valide. Voilà pour la petite rectification. ;) Bruno -
Patrick avait donné une astuce pour speeder le chargement Acrobat 6.0 (faire une recherche sur CadXP) J'avais fait les manips et ma foi le gain est très apréciable, mais il reste quand même un peu plus long que la version précédente. PS: Jamais rencontré de problème à l'utilisation. MERCI Patrick :P
-
C'est bien la valeur en pixel en X Y de la barre d'outil. Personellement, j'ai remarqué que la modification de ces valeurs dans le MNU avec recompilation en MNS ne changaient effectivement "que dalle" dans la position du menu si celui avait déjà etait utilisé. Je pense (je m'avance un peu) que la postion des menus utilisés doivent être aussi sauvegardés dans la base de registre et que celle ci l'emporte sur la position défini dans le MNU. Si quelqu'un pouvait confirmer, je tout ouie.
-
Une commande \"joindre\" (_join)
bonuscad a répondu à un(e) sujet de nomutt dans AutoCAD, liste de souhaits
Une demande sur le forum de planetar d'un utilisateur posédant une routine qui ne fonctionnait pas sur des version supérieur à R14,était un peu similaire. Celle-ci devait traiter les lignes. J'avais modifier son code. Iil avait l'air sastifait , donc je pense pouvoir le transmettre ici ;;functions VectorProduct & collinear ;;Armin Antkowiak, Berlin ;;http://www.polyface.de/general.html ;;mailto:info@polyface.de (defun vectorProduct (v1 v2 / ) (list (- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2))) (- (* (caddr v1) (car v2)) (* (car v1) (caddr v2))) (- (* (car v1) (cadr v2)) (* (cadr v1) (car v2))) ) ) (defun collinear (p1 p2 p3 / tol) (setq tol 1.0e-012) (equal '(0.0 0.0 0.0) (vectorProduct (mapcar '- p2 p1) (mapcar '- p3 p1)) tol ) ) (defun c:boucher ( / jsel n ent dxf_ent snd_ent dxf_snd dxf_10 dxf11 dxf_10b dxf_11b temp) (setq jsel (ssget '((0 . "LINE")))) (while (setq ent (ssname jsel 0)) (ssdel ent jsel) (setq n 0) (repeat (sslength jsel) (setq dxf_ent (entget ent)) (cond ((setq snd_ent (ssname jsel n)) (setq dxf_snd (entget snd_ent) dxf_10 (cdr (assoc 10 dxf_ent)) dxf_11 (cdr (assoc 11 dxf_ent)) dxf_10b (cdr (assoc 10 dxf_snd)) dxf_11b (cdr (assoc 11 dxf_snd)) ) (cond ((and (collinear dxf_10 dxf_11 dxf_10b) (collinear dxf_10 dxf_11 dxf_11b)) (if (> (distance dxf_10 dxf_10b) (distance dxf_10 dxf_11b)) (setq temp dxf_10b dxf_10b dxf_11b dxf_11b temp ) ) (if (< (distance dxf_10 dxf_10b) (distance dxf_11 dxf_10b)) (setq temp dxf_10 dxf_10 dxf_11 dxf_11 temp ) ) (ssdel snd_ent jsel) (entdel snd_ent) (setq dxf_ent (subst (cons 10 dxf_10) (assoc 10 dxf_ent) dxf_ent) dxf_ent (subst (cons 11 dxf_11b) (assoc 11 dxf_ent) dxf_ent) ) (entmod dxf_ent) ) ) ) ) (setq n (1+ n)) ) ) (princ) ) Désolé pour les LT :( -
Intervenir au même endroit, (defun htype_info ( / htype na flag flag2) (while (not flag2) (if (setq htype '("Block" nil)) (progn (if (not #sprhatch_type) (setq #sprhatch_type "Block"));if (setq na (cadr htype) htype (car htype) );setq (if #clipitres (setq a #clipitres) (setq a (acet-geom-pixel-unit));setq );if (setq #clipitres a) (initget 6) (setq a (getreal (strcat "Tolérance d'erreur des courbes <" (ai_rtos #clipitres) ">: "))) (if (not a) (setq a #clipitres)) Note: Je ne trouve pas très judicieux de modifier une fonction des express, car tes modifs auront peu de chance d'être portable sur une version ultérieure des express.
-
Salut, Pourquoi ne pas utiliser des attributs à valeur constantes? A ce moment là, lors de l'insertion aucune valeur ne te sera demandé, l'attribut aura sa valeur par défaut. Bruno
-
En complément (itoa) fait la conversion d'un entier en chaine de caractère (Interger TO Alphanuméric) (rtos) fait la conversion d'un réel en chaine de caractère (Real TO String) voilà pour les infos que j'ai oublié
-
(getint = fournir un entier (INTeger) (getreal= fournir un réel (REAL) conseil: tu devrais utiliser la fonction (initget bit de controle) pour tes fonction (getxxx) excepté getstring (getstring) peut être appelé avec l'argument T justement pour permettre la saisie d'espace dans la chaine de texte. La validation ne se fait alors qu'a l'aide de la touche ENTREE Bonne continuation :D
-
Voici un autre exemple qui te montrera de quoi il faut tenir compte pour ne pas avoir de surprise! (defun c:test ( / i nbrf oldtxteval) (setq i 50.0) ;définition de tes variables (setq nbrf 35.0) (setvar "CMDECHO" 1) ;activera l'echo de la commande texte (setq oldtxteval (getvar "TEXTEVAL")) ;enregistre l'état de la variable TEXTEVAL (setvar "TEXTEVAL" 0) ;met la variable TEXTEVAL à 0 (princ "\nSolution avec TEXTEVAL à 0") (if (zerop (cdr (assoc 40 (tblsearch "style" (getvar "textstyle"))))) ; Teste si la hauteur du style de texte est fixée (command "_.-text" pause "" "" (rtos (/ i nbrf) 2 2)) ;système décimal avec 2 unité de précision (command "_.-text" pause "" (rtos (/ i nbrf) 2 2)) ) (setvar "TEXTEVAL" 1) ;met TEXTEVAL à 1 (princ "\nSolution avec TEXTEVAL à 1") (if (zerop (cdr (assoc 40 (tblsearch "style" (getvar "textstyle"))))) (command "_.-text" pause "" "" (/ i nbrf)) ; evalue directement l'expression lisp (command "_.-text" pause "" (/ i nbrf)) ) (setvar "TEXTEVAL" oldtxteval) ;restaure l'état de la variable TEXTEVAL )
-
Salut, Encore juste une petite modif et cela devrait aller! ;) original: (defun htype_info ( / htype na flag flag2) (while (not flag2) (if (setq htype (dd_htype_info)) (progn (setq na (cadr htype) htype (car htype) );setq modifié: (while (not flag2) (if (setq htype '("Block" nil)) (progn (if (not #sprhatch_type) (setq #sprhatch_type "Block"));if (setq na (cadr htype) htype (car htype) );setq Ormis cela, les modifs précédentes de Patrick 35 devraient être bonne (pas testé) En tout ca de rajouter (if (not #sprhatch_type) (setq #sprhatch_type "Block")); permet de remplir avec les coupes de bloc. Bonne chance
-
Salut, Encore juste une petite modif et cela devrait aller! ;) original: (defun htype_info ( / htype na flag flag2) (while (not flag2) (if (setq htype (dd_htype_info)) (progn (setq na (cadr htype) htype (car htype) );setq modifié: (while (not flag2) (if (setq htype '("Block" nil)) (progn (if (not #sprhatch_type) (setq #sprhatch_type "Block"));if (setq na (cadr htype) htype (car htype) );setq Ormis cela, les modifs précédentes de Patrick 35 devraient être bonne (pas testé) En tout ca de rajouter (if (not #sprhatch_type) (setq #sprhatch_type "Block")); permet de remplir avec les coupes de bloc. Bonne chance
-
Vous avez du mal avec les échelles de présentation?
bonuscad a posté un sujet dans Programmer en s'amusant
Vous connaissez votre unité Vous savez à quelle échelle vous voulez mettre votre fenêtre de présentation. Mais vous êtes perdu dans les paramètres. :casstet: Essayez ceci (defun c:qz ( / unit_draw fz f_m flag) (cond ((ssget "_X" '((0 . "VIEWPORT"))) (if (or (eq (getvar "USERS5") "") (not (eq (substr (getvar "USERS5") 1 2) "qz"))) (progn (initget "KM ME CM MM") (if (not(setq unit_draw (getkword "\nDessin réalisé en [KM/ME/CM/MM] : "))) (setq unit_draw "ME") ) (cond ((eq unit_draw "KM") (setq unit_draw 1000000) ) ((eq unit_draw "ME") (setq unit_draw 1000) ) ((eq unit_draw "CM") (setq unit_draw 10) ) ((eq unit_draw "MM") (setq unit_draw 1) ) ) (setvar "USERS5" (strcat "qz" (itoa unit_draw))) ) (setq unit_draw (atoi (substr (getvar "USERS5") 3))) ) (initget 6 "5 10 25 50 100 200 250 500 1000 2000 2500 5000 10000 25000 50000 1000000") (setq fz (getint "\nChoix de l'échelle[5/10/25/50/100/200/250/500/1000/2000/2500/5000/10000/25000/50000/1000000]? <100>:")) (if (not fz) (setq fz 100)) (if (eq (getvar "TILEMODE") 1) (setvar "TILEMODE" 0)) (if (not (eq (getvar "CVPORT") 1)) (command "_.pspace")) (princ "\nChoisissez la fenêtre à mettre à l'échelle") (while (null (setq f_m (ssget "_:S" '((0 . "VIEWPORT"))))) (princ "\nN'est pas une fenêtre") ) (setq f_m (ssname f_m 0)) (if (eq (boole 1 16384 (cdr (assoc 90 (entget f_m)))) 16384) (progn (command "_.mview" "_lock" "_off" f_m "") (setq flag T) ) (setq flag nil) ) (command "_.mspace") (setvar "CVPORT" (cdr (assoc 69 (entget f_m)))) (command "'_.zoom" "_ce" (getvar "VIEWCTR") (strcat (itoa unit_draw) "/" (itoa fz) "XP")) (command "_.pspace") (if flag (command "_.mview" "_lock" "_on" f_m "")) ) (T (princ "\nAucunes fenêtres dans l'espace papier") ) ) (princ) ) -
Salut, Comme c'est gratuit ce n'est pas parfait. Blague à part, je connais l'existence de ce problème qui est lié à windows XP. Je ne l'ai pas encore clairement identifier, mais je pense que c'est dut à l'accés aux fichiers à travers la commande "SHELL" dans la routine. Au fait c'est bien ça ? Tu es sous XP! Malheuresement je ne suis pas équipé de XP et ne peut débuger ce problème. Si tu le désire, tu peux essayer de m'aider à le corriger. Voici mon courriel prof. pour converser car je ne pense pas que le forum soit adapté pour faire cela. Bruno.Valsecchi@equipement.gouv.fr
-
Bonjour, Une solution utilisant un module extene voir: http://www-2.cs.cmu.edu/~quake/triangle.html Dans la zone téléchargement free de CADxp tu dois trouver bonuscad. Tu devra donc récupérer au minimun dans le zip triangle.exe et trinod.lsp, que tu placera dans un dossier de recherche d'autocad. Tu pourras alors générer des 3Dfaces ou Pmaille ou 3Dsolid (je déconseille la dernière option qui avorte souvent). Merci à Jonathan Richard Shewchuk pour ce module externe. ;)
-
Comme Eric, si ça concerne les unités des axes des SCU, ce n'est pas possible. Je ne sais pas ce que tu veut faire, mais tu peux utiliser un subterfuge pour simuler une déformation des unités. Exemple à paufiner et a adapter: (defun c:deformX (/ ) (initget 8) (setq echll (getpoint "\nRapport de déformation <1,0.5>: ")) (if (eq echll ()) (setq echll '(1 0.5))) (setvar "ucsfollow" 0) (command "_.ucs" "_y" (angtos (atan (/ (sqrt (- (* (car echll) (car echll)) (* (cadr echll) (cadr echll)) ) ) (cadr echll) ) ) 0 4 ) ) )
-
Problème pour purger un bloc nommé _OPEN
bonuscad a répondu à un(e) sujet de Giques dans AutoCAD LT 95, 97, 98
Je viens de tomber par hasard sur la provenance du bloc "_OPEN" C'est un bloc interne provenant de la cotation, voir l'aide sur la variable "DIMBLK" Voilà, si ca peut t'aider a te séparer de ce bloc. -
Pour ma part sous 2002, je ne rencontre pas ce problème :exclam:
-
Problème pour purger un bloc nommé _OPEN
bonuscad a répondu à un(e) sujet de Giques dans AutoCAD LT 95, 97, 98
Salut, Tu peux peut être essayer la commande -WBLOC J'insiste sur le tiret Ex: -wbloc (boite de dialogue de fichier) Entrez le nom du bloc existant ou (= (bloc=fichier de sortie)/* (dessin entier)] : * -
infos sur une LWPOLYLINE en arc
bonuscad a répondu à un(e) sujet de CGDESSINE dans Pour aller plus loin en LISP
Salut, Inspiré de la discussion http://www.cadxp.com/sujetXForum-3162.htm qui m'a permis d'écrire plusieurs routines basée sur ce code: Elever une perpendiculaire, continuer une tangente a un segment ou un arc, interroger un angle entre 2 segments, faire une bissectrice entre 2 segment, interroger 1 rayon Voici cette dernière ou tu retrouvera le rayon calculer sur un arc de polyligne. Je te laisse méditer dessus :) (defun near_vertex_arr (obj / obj dxf_obj obj_vlax pt_sel pt_dist param_start param_end perim_obj e_next l_som l_arr l_dist n n_first n_second) (setq dxf_obj (entget (car obj))) (vl-load-com) (setq obj_vlax (vlax-ename->vla-object (car obj)) pt_sel (vlax-curve-getClosestPointTo obj_vlax (trans (osnap (cadr obj) "_near") 1 0)) pt_dist (vlax-curve-getDistAtPoint obj_vlax pt_sel) 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)) ) (cond ((eq (cdr (assoc 0 dxf_obj)) "LWPOLYLINE") (setq l_som (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) dxf_obj)) l_arr (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 42)) dxf_obj)) ) ) (T (setq e_next (entnext (car obj))) (while (= "VERTEX" (cdr (assoc 0 (setq dxf_next (entget e_next))))) (if (zerop (boole 1 223 (cdr (assoc 70 dxf_next)))) (setq l_som (cons (cdr (assoc 10 dxf_next)) l_som) l_arr (cons (cdr (assoc 42 dxf_next)) l_arr) ) ) (setq e_next (entnext e_next)) ) (setq l_som (reverse l_som) l_arr (reverse l_arr)) ) ) (setq l_dist (mapcar '(lambda (x) (vlax-curve-getDistAtPoint obj_vlax x)) l_som)) (if (vlax-curve-isClosed obj_vlax) (progn (setq l_som (append l_som (list (car l_som)))) (setq l_dist (append l_dist (list perim_obj))) ) ) (setq n 0) (repeat (1- (length l_dist)) (if (and (> pt_dist (nth n l_dist)) (< pt_dist (nth (1+ n) l_dist))) (setq n_first n n_second (1+ n)) ) (setq n (1+ n)) ) (list (trans (nth n_first l_som) 0 1) (trans (nth n_second l_som) 0 1) (nth n_first l_arr)) ) (defun c:q_ray ( / ent dxf_ent typent pt_sel l_2pt) (setvar "cmdecho" 0) (while (not (setq ent (entsel "\nInterroger le rayon du segment arrondi: ")))) (setq typent (cdr (assoc 0 (setq dxf_ent (entget (car ent))))) pt_sel (osnap (cadr ent) "_near")) (cond ((and (or (eq typent "ARC") (eq typent "CIRCLE")) (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0))) (setq l_2pt (distance pt_sel (trans (cdr (assoc 10 dxf_ent)) 0 1))) ) ((or (and (eq typent "LWPOLYLINE") (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0))) (and (eq typent "POLYLINE") (zerop (boole 1 124 (cdr (assoc 70 dxf_ent)))) (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) ) ) (setq l_2pt (near_vertex_arr ent)) (if (zerop (caddr l_2pt)) (princ "\nCe segment est droit et ne peut être interrogé!") (setq l_2pt (/ (distance (car l_2pt) (cadr l_2pt)) (sin (* 2.0 (atan (caddr l_2pt)))) 2.0))) ) (T (if (not (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0))) (princ "\nEntité non parralèlle au SCG.") (princ "\nCet objet ne peut être interrogé!") ) ) ) (if (eq (type l_2pt) 'REAL) (progn (alert (strcat "\nRayon = " (rtos (abs l_2pt) 2 3) ) ) (princ (strcat "\nRayon = " (rtos (abs l_2pt) 2 3) ) ) ) ) (setvar "cmdecho" 1) (princ) ) -
Si tu veux vraiment te débarrasser de ces type de lignes Va dans le menu déroulant "format" Puis dans "type de ligne..." Dans la boite de dialogue clique sur le bouton "Charger" Choisi le fichier "acadisoline" (généralement par défaut) Et la tu compare les type de ligne que tu as dans la 1ere boite avec la seconde (pas facile !) Ceux qui ne se trouvent pas dans la seconde boite sont succeptible d'être des personnalisée. Relèvent ces noms Applique un filtre sur tous les objet avec ces noms pour puovoir leur affecter un autre type de ligne. Mais tu peux opter pour l'aide de Serge. Pour Serge Si c'est un fichier de police (s'il donne suite) je suis interressé par tes conclusions.
-
Pour ma part je n'ai jamais utilisé la solution d'autodesk. Je pense que tu devrais te pencher sur les type de lignes utilisés dans ton dessin. Il est fort possible qu'un ou des type de lignes fassent référence à un fichier de forme SHX spécifique. La routine du lien ne traite peut être pas ce problème. Soit tu réaffecte les objets concernés a un autre type de ligne (utilise les filtres) Soit tu recrée ton type de ligne Si tu adopte la 2eme solution je te propose d'utiliser le code suivant, tu pourra modifier alors les paramètre qui clochent, ex le nom de la forme SHX utilisée. Fonctionne a partir de 2002 et au delà je pense. (defun c:model_typline ( / ent ent_dxf nam_tl def_tl prec m_adir m_abas nam_lin def_lin nbr_lin w_line lg_tiret tp_cpx cod_shx ss_ent styl_tl file_shx scal_motif rot_motif x_motif y_motif str_motif) (setvar "cmdecho" 0) (while (not (setq ent (entsel "\nChoix du TypeLigne modèle: ")))) (setq ent_dxf (entget (car ent)) nam_tl (assoc 6 ent_dxf)) (cond ((and (cdr nam_tl) (/= (cdr nam_tl) "ByLayer") (/= (cdr nam_tl) "ByBlock")) (initget 4) (setq def_tl (entget (tblobjname "Ltype" (cdr nam_tl))) prec (getint (strcat "\nPrécision décimale désirée<" (itoa (getvar "LUPREC")) ">: ")) ) (if (not prec) (setq prec (getvar "LUPREC"))) (setq m_adir (getvar "angdir") m_abas (getvar "angbase") nam_lin (strcat "*" (cdr (assoc 2 def_tl))) def_lin (strcat "," (cdr (assoc 3 def_tl))) lg_lin (cdr (assoc 40 def_tl)) nbr_line (cdr (assoc 73 def_tl)) w_line "\nA" ) (setvar "angdir" 0) (setvar "angbase" 0) (textscr) (princ (strcat "\n" nam_lin def_lin)) (princ w_line) (while (/= (caar def_tl) 49) (setq def_tl (cdr def_tl)) ) (while def_tl (cond ((eq 49 (caar def_tl)) (setq lg_tiret (cdar def_tl)) (princ (strcat "," (rtos lg_tiret 2 prec))) ) ((eq 74 (caar def_tl)) (setq tp_cpx (cdar def_tl)) ) ((eq 75 (caar def_tl)) (setq cod_shx (cdar def_tl)) (cond ((zerop cod_shx) (princ (strcat ",[\"" (cdr (assoc 9 def_tl)) "\"")) ) ((eq tp_cpx 4) (princ ",[*") ) ) ) ((eq 340 (caar def_tl)) (setq ss_ent (entget (cdr (assoc 340 def_tl))) styl_tl (cdr (assoc 2 ss_ent)) file_shx (cdr (assoc 3 ss_ent)) ) (if (eq styl_tl "") (princ (strcat (itoa cod_shx) "," file_shx)) (princ (strcat "," styl_tl)) ) ) ((eq 46 (caar def_tl)) (setq scal_motif (cdr (assoc 46 def_tl))) (princ (strcat ",S=" (rtos scal_motif 2 prec))) ) ((eq 50 (caar def_tl)) (setq rot_motif (cdr (assoc 50 def_tl))) (princ (strcat ",R=" (angtos rot_motif 0 prec))) ) ((eq 44 (caar def_tl)) (setq x_motif (cdr (assoc 44 def_tl))) (princ (strcat ",x=" (rtos x_motif 2 prec))) ) ((eq 45 (caar def_tl)) (setq y_motif (cdr (assoc 45 def_tl))) (princ (strcat ",y=" (rtos y_motif 2 prec) "]")) ) ((eq 9 (caar def_tl)) (setq str_motif (cdr (assoc 9 def_tl))) ) ) (setq def_tl (cdr def_tl)) ) (setvar "angdir" m_adir) (setvar "angbase" m_abas) ) (T (princ "\nImpossible de récuperer le type de ligne de l'objet pointé.")) ) (setvar "cmdecho" 1) (prin1) )
-
Serge, Est ce que la solution de transformé ta fameuse ligne en: (mapcar '(lambda (x) (trans x e 0)) (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (setq e (car (entsel))))))) Ne serait t'elle pas plus sûr (tenir compte du dxf 210?) pour ramener les points dans le SCG?
