-
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
-
Si les Z de la poly3D sont différents, impossible de faire cela en une seule opération. Manuellement cela est faisable mais fastidieux, par programmation je ne vois pas de solutions non plus à cause de la forme concave possible de la figure à hachurer. Si tu veux le faire manuellement, il va falloir trianguler ta poly3D entre chaque sommets et pour chaque triangle coller un SCU dessus, puis hachurer ce triangle. Et ceci pour chaque triangle. Pour t'assister un peu et rendre l'execution moins fastidieuse, tu peux essayer d'utiliser le lisp suivant (qui est plus proche d'un script) Tu n'a plus qu'a pointer les 3 points de ton triangle à hachurer (defun c:assistance_hachure3D () (setvar "osmode" 1) (setq lst_pt nil js (ssadd)) (repeat 3 (setq pt (getpoint "\nPoint")) (setq lst_pt (cons pt lst_pt)) ) (setvar "osmode" 0) (command "_.line" (car lst_pt) (cadr lst_pt) "") (setq js (ssadd (entlast) js)) (command "_.line" (cadr lst_pt) (caddr lst_pt) "") (setq js (ssadd (entlast) js)) (command "_.line" (caddr lst_pt) (car lst_pt) "") (setq js (ssadd (entlast) js)) (command "_.ucs" "_3point" (caddr lst_pt) (cadr lst_pt) (car lst_pt)) (command "_.hatch" "" "" "" js "") (command "_.ucs" "_previous") (command "_.erase" js "") ) NB: Je considère que la commande hachure est déjà réglée par défaut. Si ce n'est pas le cas, execute d'abord une hachure en réglant tes paramètres puis efface celle-ci (pas de commande "U" bien sur)
-
Tracasseries administratives vues par Noé...
bonuscad a répondu à un(e) sujet de kallain dans Pause café
Un seul mot "Excelent" -
Cela vient (à cause du fichier DCL) du fait que les fichiers ne sont pas placé dans un dossier de recherche d'Autocad. Soit tu déplaces les 2 fichiers dans un dossier de recherche existant. Soit tu rajoutes un chemin de recherche pointant le dossier ou se trouve ces 2 fichiers.
-
Une façon parmis tant d'autres. Celle-ci ferait partie des plus simple ! (defun c:mur ( / js pt_end width_wall pt_where) (setq js (ssadd)) (setvar "cmdecho" 1) (command "_.pline" (while (not (zerop (getvar "cmdactive"))) (command pause) ) ) (setq js (ssadd (entlast) js) pt_end (getvar "lastpoint")) (initget 3) (setq width_wall (getreal "\nDonner l'épaisseur du mur '+ à gauche, '- à droite ?: ")) (if (> width_wall 0.0) (setq pt_where (polar pt_end (+ (getvar "lastangle") (/ pi 2)) (abs width_wall))) (setq pt_where (polar pt_end (- (getvar "lastangle") (/ pi 2)) (abs width_wall))) ) (setvar "cmdecho" 0) (command "_.offset" (abs width_wall) (entlast) "_none" pt_where "") (setq js (ssadd (entlast) js)) (command "_.line" "_none" pt_end "_none" pt_where "") (setq js (ssadd (entlast) js)) (command "_.pedit" js "_join" js "" "_close" "") (setvar "cmdecho" 1) (prin1) ) Tu peux encore l"améliorer ou faire d'une façon différente. NB: + à gauche par rapport au sens de parcours de la polyligne tracée.
-
C'est n'est plus les "Crops circles" (cercles de cultures), mais les "Water circles" (cercles d'eau) :exclam: On va bientôt les voir fleurir dans les lacs et les étangs des campagnes anglaises du côté de Stonege... A quand le film?
-
Une procédure possible! Pour l'exemple les fichiers menu s'appellent "bonuscad", il te faudra adapter les noms pour toi. Le fichier MNU source est placé ici à la racine, à modifier aussi en conséquence. Tout d'abord tu vas créer un fichier lisp supplémentaire dans ton dossier ou sont tes menus Le fichier "reinit-mnu.lsp" qui va contenir: (defun reinit-mnu ( / my_mnu where_mnu) (setq my_mnu '("bonuscad.mnc" "bonuscad.mnr" "bonuscad.mns")) (cond ((and (setq where_mnu (findfile (car my_mnu))) (not flag_mnu)) (setq where_mnu (vl-string-right-trim (car my_mnu) where_mnu)) (command "_.menuunload" "bonuscad") (foreach n my_mnu (vl-file-delete (strcat where_mnu n)) ) (vl-file-copy "c:/bonuscad.mnu" (strcat where_mnu "bonuscad.mns")) (command "_.menuload" "bonuscad") (setq flag_mnu T) ) (T (if (not flag_mnu) (princ "\nEchec de la procédure") ) ) ) ) Puis rajouter dans ton fichier menu.mnl ou le créer s'il n'existe pas. Ici pour l'exemple c'est aussi "bonuscad.mnl". Y placer les lignes suivante: (load "reinit-mnu.lsp") (reinit-mnu) (princ) En faisant comme ceci, les menus seront réinitialisés à chaque ouverture de dessin si ton fichier menu était chargé par défaut auparavant. Il y a peut être encore des ajustements à faire, ou tourner la chose différemment. Mon exemple n'est pas un fichier batch :(
-
Regarde ici Bien que la solution donnée ne soit pas la panacée, sait on jamais!....
-
Boucle d\'extraction attribut fixe dans bloc imbriqués
bonuscad a répondu à un(e) sujet de Bred dans Débuter en LISP
De rien! Je me suis appuyé sur un code que j'avais donné ici classé sans suite :( -
Boucle d\'extraction attribut fixe dans bloc imbriqués
bonuscad a répondu à un(e) sujet de Bred dans Débuter en LISP
Je te propose quelque chose, sans garantie, bien tester pour voir si les résultats te semble corrects car ce n'est pas évident dans les imbrications :casstet: (defun xplore (l / ent ) (while (setq ent (entnext (cdar l))) (setq l (entget ent)) (if (eq (cdr (assoc 0 l)) "INSERT") (xplore (entget (cdr (assoc -2 (tblsearch "BLOCK" (cdr (assoc 2 l))))))) ) (if (eq (cdr (assoc 0 l)) "ATTDEF") (print (strcat "Etiquette = " (cdr (assoc 2 l)) " ; Valeur = " (cdr (assoc 1 l)))) ) ) ) (defun c:block_summary ( / first_blk l_blk n_blk js) (setq first_blk (tblnext "BLOCK" T)) (cond (first_blk (setq l_blk (list first_blk)) (while (setq n_blk (tblnext "BLOCK")) (setq l_blk (cons n_blk l_blk)) ) (foreach n l_blk (setq js (ssget "_X" (list (cons 0 "INSERT") (assoc 2 n)))) (print (strcat "BLOC : " (cdr (assoc 2 n)) " " (itoa (if js (sslength js) 0)) " insertion(s)")) (cond ((< (cdr (assoc 70 n)) 4) (setq dxf_lst (entget (cdr (assoc -2 n)))) (xplore dxf_lst) ) (T (princ " -> XREF. Définition ignorée")) ) (print) ) ) (T (princ "\nPas de blocs définis!") ) ) (prin1) ) -
Je vais dans le même sens qur Tramber. Je rajouterais juste que tu peux déplacer ton MNU dans un endroit sûr, car il n'est pas indispensable pour que le reste soit chargé. Donc ton menu source sera ainsi préservé et facilement réimplantable en cas de problème. Un fichier batch pourrait même être envisagé à chaque ouverture d'autocad. On efface le mns et mnc et on recopie le mnu en mns. Ainsi le menu sera recompilé à chaque ouverture de session.
-
Ha oui, tiens suivant la version d'autocad, il inverse les sommets. :casstet: Bon ben, je te propose de faire la modif suivante: (setq l_3dn ; (reverse... <- ICI .... ... ... ; ) <- ICI ) (command "_.pline") Tu enlèves (reverse ou tu mets un";" en début de ligne AVEC la paranthèse correspondante. Voilà, pas trop dur? ;)
-
Boucle d\'extraction attribut fixe dans bloc imbriqués
bonuscad a répondu à un(e) sujet de Bred dans Débuter en LISP
Y a un truc qui m'échappe Cela veut dire que tu connais donc la valeur de tes attributs, alors pourquoi vouloir les extraire? Il te suffit de faire un comptage du nombre d'insertion de ton bloc et d'y affecter toi même les valeurs puisque tu les connais! -
Boucle d\'extraction attribut fixe dans bloc imbriqués
bonuscad a répondu à un(e) sujet de Bred dans Débuter en LISP
Je pense que simplement que les commandes standard d'Autocad fonctionne suivant le même principe que ce que pourrais faire un lisp. Donc je pense que cette commande s'appuie sur les bits de controle pour editer l'attribut. En conséquence vu que cette commande refuse de fonctionner sur un attribut constant, pour moi cela veut dire que le bit de controle n'est pas valide ou inexistant. Donc je vois mal comment faire avec un lisp pour acceder simplement a cet attribut de la même manière. Il est possible que ma réflexion soit erronée, mais j'essaye d'être logique, c'est tout :casstet: -
Boucle d\'extraction attribut fixe dans bloc imbriqués
bonuscad a répondu à un(e) sujet de Bred dans Débuter en LISP
Je pense qu'il te faut passer par la table des "BLOCK" car effectivement pour un attribut constant le code 66 n'apparait pas dans un "INSERT" Et la effectivement le code 70 peut prendre ces différente valeur. Dans ton cas tu devrait avoir '(70 . 2) Mais ça complique les choses, d'ailleurs "EATTEDIT" ne fonctionne pas sur ce genre de bloc à attribut constant. Complexe ton histoire :casstet: -
Je pense, après avoir essayé justement de comprendre, que cela concerne surtout la commande diviser ou mesurer avec l'option bloc. En effet le bloc ne suit pas correctement le chemin malgré l'option "aligner avec l'objet" et ceux-ci sont parfois projeté sur le scu courant. NB: j'édite mon post précédent pour une commande similaire à mesurer ou diviser qui donne des résultats tout à fait différent (avec l'option bloc) que les commandes classiques.
-
Tramber ton souhait m'a donné une idée ;) Je l'ai fais pour la commande mesurer (on pourrait faire de même pour diviser!) :exclam: Testé assez rapidement, mais ça à l'air de fonctionner Si ça peut te rendre service (defun z_dir (p1 p2 / ) (trans '(0.0 1.0 0.0) (mapcar '(lambda (k) (/ k (sqrt (apply '+ (mapcar '(lambda (x) (* x x)) (mapcar '- p2 p1) ) ) ) ) ) (mapcar '- p2 p1) ) 0 ) ) (defun c:my_divide-measure ( / js ent vla_obj perim_obj why flag name_blk len_vtx d_x param_pt pt_first pt_snd dxf_210) (vl-load-com) (princ "\nChoix de l'objet à mesurer/diviser: ") (while (not (setq js (ssget "_+.:E:S" (list (cons 0 "*POLYLINE,LINE,ARC,CIRCLE,ELLIPSE,SPLINE") (cons 67 (if (eq (getvar "CVPORT") 2) 0 1)) (cons 410 (if (eq (getvar "CVPORT") 2) "Model" (getvar "CTAB"))) (cons -4 "< NOT") (cons -4 "&") (cons 70 112) (cons -4 "NOT>") ) ) ) ) ) (setq ent (ssname js 0) vla_obj (vlax-ename->vla-object ent) perim_obj (vlax-curve-getDistAtParam vla_obj (vlax-curve-getEndParam vla_obj)) ) (initget "Mesurer Diviser _Measure Divide") (if (eq (getkword "\n[Mesurer/Diviser] l'objet? : ") "Divide") (progn (initget 7 "Bloc _Block") (setq why (getint "\nEntrez le nombre de segments ou [bloc]: ") flag T) ) (progn (initget 7 "Bloc _Block") (setq why (getdist "\nSpécifiez la longueur du segment ou [bloc]: ") flag nil) ) ) (cond ((eq why "Block") (while (not (tblsearch "BLOCK" (setq name_blk (getstring "\nNom du bloc: " T)))) (princ "\nNom de bloc **incorrect**") ) (initget 7) (if flag (setq len_vtx (getint "\nEntrez le nombre de segments: ")) (setq len_vtx (getdist "\nSpécifiez la longueur du segment: ")) ) ) (T (setq len_vtx why) ) ) (setq d_x 0.0) (while (< d_x perim_obj) (setq param_pt (vlax-curve-getParamAtPoint vla_obj (vlax-curve-getPointAtDist vla_obj d_x)) pt_first (vlax-curve-getPointAtParam vla_obj (fix param_pt)) pt_snd (vlax-curve-getPointAtParam vla_obj (1+ (fix param_pt))) dxf_210 (z_dir pt_first pt_snd) ) (if (null pt_snd) (setq pt_snd (vlax-curve-getEndPoint vla_obj)) ) (setq dxf_210 (z_dir pt_first pt_snd)) (cond ((eq why "Block") (entmake (list (cons 0 "INSERT") (cons 100 "AcDbEntity") (assoc 67 (entget ent)) (assoc 410 (entget ent)) (cons 8 (getvar "CLAYER")) (cons 100 "AcDbBlockReference") (cons 2 name_blk) (cons 10 (trans (vlax-curve-getPointAtDist vla_obj d_x) 0 dxf_210)) (cons 210 dxf_210) ) ) ) (T (entmake (list (cons 0 "POINT") (cons 100 "AcDbEntity") (assoc 67 (entget ent)) (assoc 410 (entget ent)) (cons 8 (getvar "CLAYER")) (cons 100 "AcDbPoint") (cons 10 (vlax-curve-getPointAtDist vla_obj d_x)) (cons 210 (list 0.0 0.0 1.0)) ) ) ) ) (if flag (setq d_x (+ d_x (/ perim_obj len_vtx))) (setq d_x (+ d_x len_vtx)) ) ) (prin1) ) NB : Comme d'hab. enlever l'espace après "< NOT" [Edité le 26/7/2006 par bonuscad]
-
Ou ceci, pour pouvoir définir le calque a récupérer plus surement sans oublier une entité. Il faut juste définir l' écriture dans un fichier, ou faire un copier coller de l'écran texte d'autocad. ((lambda ( / js dxf_ent n) (princ "\nPointer un Texte/MultiTexte/Définition d'attribut.") (while (null (setq js (ssget "_+.:E:S" '((0 . "*TEXT,ATTDEF")))))) (setq js (ssget "_X" (list (assoc 0 (setq dxf_ent (entget (ssname js 0)))) (assoc 8 dxf_ent) (cons 67 (if (eq (getvar "CVPORT") 2) 0 1)) (cons 410 (if (eq (getvar "CVPORT") 2) "Model" (getvar "CTAB"))) ) ) ) (princ "\nEntitées ") (princ (cdr (assoc 0 dxf_ent))) (princ " sélectionnées.") (princ "\n** Toutes action, clavier/souris, pour continuer! **") (grread) (repeat (setq n (sslength js)) (setq dxf_ent (entget (ssname js (setq n (1- n))))) (princ "\nValeur du texte : ") (princ (cdr (assoc 1 dxf_ent))) ) (prin1) ))
-
Je suis de l'avis de Lecrabe, difficile de protéger efficacement des informations pour un utilisateur averti et curieux comme moi par exemple!. Si vraiment ces infos sont sensibles, pour ma part je ferais 2 fichiers distincts. Un contenant toutes la partie graphique et l'autre contenant ces blocs avec ses attributs sensibles qui serait attaché en xref. Lors de la livraison je ferais simplement une copie de ce fichier attaché en xref dans lequel je redefinirais les blocs sans les attributs sensibles et garderais précieusement mon original pour bosser. Comme ça t'es sur qu'il n'y aura pas de fuites ;) Ca me semble être le moyen le plus simple et surtout avec le plus de sureté. Ton client n'aura pas les même infos que toi dans le fichier livré! Mais tu as peut être beaucoup de blocs à redéfinir? Et là effectivement une routine pourrait t'aider à faire ce nettoyage avant livraison. Si ces attributs sensible ont toujours la même étiquette cela serait jouable pour par exemple les remmettre à "blanc".
-
Ce fut un plaisir d'aider un congénère ! "Le dinosaure lispant" ;)
-
Avec la commande "TEXTMASK" des Outils Express ?
-
Je n'avais pas vu tes réponses, désolé :exclam: Pour le caractère "< " il est mal interprété sur le forum, il faut systématiquement rajouter un "Espace" après pour qu'il apparaisse :casstet: Mais je suis content d'apprende que cela fonctionne sous une LT. Je retiens l'info car cela peux vraiment être utile pour ceux qui n'utilise pas LT-Extender. Bidouille complexe, mais ouvrant des possibilités de sélections. NB: Tu peux éditer ton post, au lieu d'en faire un nouveau
-
En reprenant le même principe du Post de ce jour. (defun c:Pt2center ( / js n dxf_ent dxf_39 dxf_10) (initget "Tous Sélection _All Select") (if (eq (getkword "\nChoix des Cercle ? [Tous/Sélection] : ") "All") (setq js (ssget "_X" (list (cons 0 "CIRCLE") (cons 67 (if (eq (getvar "CVPORT") 2) 0 1)) (cons 410 (if (eq (getvar "CVPORT") 2) "Model" (getvar "CTAB"))) ) ) ) (setq js (ssget (list (cons 0 "CIRCLE") (cons 67 (if (eq (getvar "CVPORT") 2) 0 1)) (cons 410 (if (eq (getvar "CVPORT") 2) "Model" (getvar "CTAB"))) ) ) ) ) (cond (js (setq n -1) (repeat (sslength js) (setq dxf_ent (entget (ssname js (setq n (1+ n))))) (if (cdr (assoc 39 dxf_obj)) (setq dxf_39 (cdr (assoc 39 dxf_obj))) (setq dxf_39 0.0) ) (setq dxf_10 (trans (cdr (assoc 10 dxf_ent)) (cdar dxf_ent) 0)) (entmake (list (cons 0 "POINT") (cons 100 "AcDbEntity") (assoc 67 dxf_ent) (assoc 410 dxf_ent) (assoc 8 dxf_ent) (if (assoc 62 dxf_ent) (assoc 62 dxf_ent) (cons 62 256)) (if (assoc 6 dxf_ent) (assoc 6 dxf_ent) (cons 6 "BYLAYER")) (if (assoc 370 dxf_ent) (assoc 370 dxf_ent) (cons 370 -1)) (cons 100 "AcDbPoint") (cons 10 dxf_10) (cons 39 dxf_39) (assoc 210 dxf_ent) ) ) ) (print (sslength js)) (princ " Point(s) créé(s).") ) ) (prin1) ) [Edité le 25/7/2006 par bonuscad]
-
Pour découper une/des LwPolylignes à chacun de ses sommets en conservant toutes ses propriétés. Fonctionne aussi avec les PolyArcs (tant qu'à faire) ;) (defun c:break_lw ( / js i ent dxf_obj dxf_43 dxf_38 dxf_39 dxf_10 dxf_40 dxf_41 dxf_42 dxf_39 dxf_210 n) (initget "Toutes Sélection _All Select") (if (eq (getkword "\nLWPolylignes à couper à chaque sommets? [Toutes/Sélection] : ") "All") (setq js (ssget "_X" (list (cons 0 "LWPOLYLINE") (cons 67 (if (eq (getvar "CVPORT") 2) 0 1)) (cons 410 (if (eq (getvar "CVPORT") 2) "Model" (getvar "CTAB"))) ) ) i -1 ) (setq js (ssget (list (cons 0 "LWPOLYLINE") (cons 67 (if (eq (getvar "CVPORT") 2) 0 1)) (cons 410 (if (eq (getvar "CVPORT") 2) "Model" (getvar "CTAB"))) ) ) i -1 ) ) (cond (js (repeat (sslength js) (setq dxf_obj (entget (setq ent (ssname js (setq i (1+ i)))))) (if (cdr (assoc 43 dxf_obj)) (setq dxf_43 (cdr (assoc 43 dxf_obj))) (setq dxf_43 0.0) ) (if (cdr (assoc 38 dxf_obj)) (setq dxf_38 (cdr (assoc 38 dxf_obj))) (setq dxf_38 0.0) ) (if (cdr (assoc 39 dxf_obj)) (setq dxf_39 (cdr (assoc 39 dxf_obj))) (setq dxf_39 0.0) ) (setq dxf_10 (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) dxf_obj)) dxf_40 (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 40)) dxf_obj)) dxf_41 (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 41)) dxf_obj)) dxf_42 (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 42)) dxf_obj)) dxf_210 (cdr (assoc 210 dxf_obj)) ) (if (not (zerop (boole 1 (cdr (assoc 70 dxf_obj)) 1))) (setq dxf_10 (append dxf_10 (list (car dxf_10))) dxf_40 (append dxf_40 (list (car dxf_40))) dxf_41 (append dxf_41 (list (car dxf_41))) dxf_42 (append dxf_42 (list (car dxf_42))) n (cdr (assoc 90 dxf_obj)) ) (setq n (1- (cdr (assoc 90 dxf_obj)))) ) (repeat n (entmake (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (assoc 67 dxf_obj) (assoc 410 dxf_obj) (assoc 8 dxf_obj) (if (assoc 62 dxf_obj) (assoc 62 dxf_obj) (cons 62 256)) (if (assoc 6 dxf_obj) (assoc 6 dxf_obj) (cons 6 "BYLAYER")) (if (assoc 370 dxf_obj) (assoc 370 dxf_obj) (cons 370 -1)) (cons 100 "AcDbPolyline") (cons 90 2) (cons 70 (boole 1 (cdr (assoc 70 dxf_obj)) 128)) (cons 38 dxf_38) (cons 39 dxf_39) (cons 10 (car dxf_10)) (cons 40 (car dxf_40)) (cons 41 (car dxf_41)) (cons 42 (car dxf_42)) (cons 10 (cadr dxf_10)) (cons 40 (cadr dxf_40)) (cons 41 (cadr dxf_41)) (cons 42 (cadr dxf_42)) (assoc 210 dxf_obj) ) ) (setq dxf_10 (cdr dxf_10) dxf_40 (cdr dxf_40) dxf_41 (cdr dxf_41) dxf_42 (cdr dxf_42)) ) (entdel ent) ) (print (sslength js)) (princ " LWpolyligne(s) coupée(s) à ses sommets.") ) ) (prin1) ) [Edité le 25/7/2006 par bonuscad]
-
A tout hasard, Le fichier en Xref ne contient-il pas des liens OLE? J'ai déjà eu des problèmes avec ces liens sur des Xrefs. Ils refusaient de s'ouvrir sur ma machine (ils plantaient carrément Autocad, alors que ces liens avaient été créés sur cette machine), par contre j'était arrivé à l'ouvrir sur un autre poste, puis à le réenregistrer sur celui-ci et à le réouvrir de nouveau sur mon poste! :casstet: :casstet: Par contre j'avais perdu le lien OLE qui posait problème... Depuis j'évite au maximum ce genre de liens :P
-
L'inconvénient de cette méthode, bien qu'elle fonctionne bien, et que si tu met à jour ta cotation; tes modifications sont perdues. C'est pour cela que je pense quand même que la solution du nouveau style est plus fiable. Mais bon la mise à jours avec le lisp peut être vite faites, mais ne pas oublier que ce fichier t'a été demander par un tiers et qu'il rique de ne plus retrouver ce genre de cotation s'il est manipuler par d'autre par la suite, sur un autre poste. Je tenais à le souligner.... à toi de voir...
