-
Compteur de contenus
12 247 -
Inscription
-
Dernière visite
-
Jours gagnés
209
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par (gile)
-
La variable systéme UCSXDIR donne les coordonnées du X du SCU dans le SCG (le vecteur normal). (angle '(0 0 0) (getvar "UCSXDIR")) retourne l'angle, en radians, de la projection de l'axe des X du SCU sur le plan du SCG avex l'axe des X du SCG. Si le plan du SCU est parallèle au plan du SCG, c'est l'angle entre les axes des X des deux systèmes.
-
:exclam: Alors là, merci ! Je modifie le code ci dessus (et les fautes de frappe !).
-
Salut et bienvenue, 1) Pour bien utiliser le site, tu peux lire, dans le menu principal (en haut à gauche) ->Support -> CADxp, le site. 2) Pour dessiner un filetage, ta demande n'est pas très précise. S'il s'agit de représenter un filetage en 2D, pas de problèmes majeurs tu peux faire une représentation "réaliste" ou simplifiée : http://img126.imageshack.us/img126/2145/filetage8ug.png Si tu veux modéliser un filetage en 3D, c'est plus complexe, AutoCAD ne le fait pas sans un peu de programmation.
-
Une routine qui retourne directement la liste des des sommets d'un vla-object (ou nil pour les objets n'ayant pas la prorpiété coordinates). La routine fait appel aux routines 2d-coord->pt-lst et 3d-coord->pt-lst. Version améliorée avec la contribution de BTO ;;; VrtxList Retourne la liste des sommets de l'objet (defun VrtxList (obj) (cond ((= (vla-get-ObjectName obj) "AcDbPolyline") (2d-coord->pt-lst (vlax-get obj 'coordinates)) ) ((member (vla-get-ObjectName obj) '("AcDb2dPolyline" "AcDb3dPolyline" "AcDbFace" "AcDbLeader" "AcDbMline" "AcDbPoint" "AcDbPolyFaceMesh" "AcDbPolygonMesh" "AcDbSolid" "AcDbTrace" ) ) (3d-coord->pt-lst (vlax-get obj 'coordinates)) ) ) ) [Edité le 19/5/2006 par (gile)]
-
L'essentiel est que çà marche, mais là, difficile de faire plus concis ! Bravo.
-
Pour récupérer les coordonnées des sommets d'entités complexes vla-get-coordinates est plus pratique que les boucles avec entnext, mais le résultat retourné, un variant est difficilement exploitable en l'état. Voici donc deux petites routines (définies récursivement parceque je trouve çà plus élégant) pour convertir le variant en liste de points. Pour les polylignes optimisées (lwpolyline) les points sont en 2D (X Y) dans le SCO ;;; Convertit un variant de coordonnées 2D en liste de points ;;; LightweightPolyline dans le SCO (defun variant->2d-pt-lst (var / 2d-coord->pt-lst) (2d-coord->pt-lst (vlax-safearray->list (vlax-variant-value var)) ) ) ;;; Convertit une liste de coordonnées 2D en liste de points (defun 2d-coord->pt-lst (lst) (cond ((atom lst) lst) ((cons (list (car lst) (cadr lst) 0.0) (2d-coord->pt-lst (cddr lst)) ) ) ) ) Pour les autres objets les point sont en 3D (X Y Z) dans le SCO avec Z = 0 pour les polylignes, dans le SCG pour les autres. ;;; Convertit un variant de coordonnées 3D en liste de points ;;; Polyline dans le SCO (Z = 0) ;;; 3DFace, 3DPolyline, Leader, MLine, Point, PolyfaceMesh, ;;; PolygonMesh, Solid, Trace dans le SCG (defun variant->3d-pt-lst (var / 3d-coord->pt-lst) (3d-coord->pt-lst (vlax-safearray->list (vlax-variant-value var)) ) ) ;;; Convertit une liste de coordonnées 3D en liste de points (defun 3d-coord->pt-lst (lst) (cond ((atom lst) lst) ((cons (list (car lst) (cadr lst) (caddr lst)) (3d-coord->pt-lst (cdddr lst)) ) ) ) ) Et deux autres pour les conversions en sens inverse. Les points dans les listes à convertir sont définis dans le SCO pour les polylignes (optimisées ou 2D) et de forme (X Y 0). Pour les lwpolylines ;;; Convertit une liste de points en variant de coordonnées 2D (defun 2d-pt-lst->variant (lst) (setq lst (apply 'append (mapcar '(lambda (x) (list (car x) (cadr x)) ) lst ) ) ) (vlax-make-variant (vlax-SafeArray-fill (vlax-make-SafeArray vlax-vbDouble (cons 0 (- (length lst) 1) ) ) lst ) ) ) Pour les autres entités ;;; Convertit une liste de points en variant de coordonnées 3D (defun 3d-pt-lst->variant (lst) (setq lst (apply 'append lst)) (vlax-make-variant (vlax-SafeArray-fill (vlax-make-SafeArray vlax-vbDouble (cons 0 (1- (length lst))) ) lst ) ) ) [Edité le 19/5/2006 par (gile)]
-
Pour traiter une liste tu peux aussi utiliser (mapcar 'fonction liste) (mapcar 'vlax-vla-object->ename b) Mais comme le dit Patrick_35, si ta routine est en VisualLISP, il est plus cohérent de continuer dans le même style, d'autant que les changements de propriétés sont plus aisés dans ce langage.
-
Salut, vla-explode retourne un réseau (array) d'objets explosés sous forme de variant. Tu peux récupérer ces objets sous forme de liste de vla-object : (setq a (vla-insertblock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point pt) chembloc 1 1 1 (/ (* pi Rot) 180))) (setq b (vlax-safearray->list (vlax-variant-value (vla-explode a)))) (vla-delete a)
-
Encore une petite amélioration (version 1.5): La mise à jour des blocs imbriqués (si ceux-ci ont été modifiés) dans les blocs insérés qui ne seraient pas inclus dans le jeu de sélection.
-
J'ai reçu une réponse de Bill Gilliss (l'auteur de M2S) aux sugestions que je lui avais faites : Je mets ci-dessous le code qu'il m'a envoyé. Celui que j'ai mis au dessus est semblable à ceci près que les invites y sont traduites en français, que j'ai rajouté une redéfinition de *error* et que les variables systèmes y sont gérées "à ma façon". ;; M2S (Mesh-to-Solid) ;; Creates an ACIS solid from an open 3d polygon mesh. ;; ;; Take 3 - Updated 5/15/2006 ;; - Works with AutoCAD 2007 as well as all previous releases. ;; Thanks to Gilles Chanteau for R2007 suggestions and ;; international syntax fixes. ;; - Works with REVSURF'd meshes that touch or cross axis of revolution. ;; - Works even if solid being constructed is not fully visible on screen. ;; - Works with all open meshes created with REVSURF, RULESURF, ;; EDGESURF, TABSURF, AI_MESH, and 3DMESH. Most of the stock 3D ;; surfaces will work if you use DDMODIFY to open them in the M ;; and N directions. ;; - Does not work with polyface entities. ;; - _. prefix added to commands for compatibility with CSG editor and ;; international users ;; ;; (c) Copyright 1998,2006 by Bill Gilliss. ;; All rights reserved... such as they are. ;; ;; bill.gilliss@aya.yale.edu gilliss@iglou.com ;; ;; I wrote this to create sculptable ACIS terrain models ;; for architectural site renderings. It can also be used ;; to create thin shells from meshes, by subtracting a moved ;; copy of the solid from the original solid, but AutoCAD's native ;; Solids Editing > Shell now does a much better job of this. ;; ;; The solid is created by projecting each mesh facet "down" ;; the *current* z-axis to a plane a user-specified distance below ;; the lowest vertex. To assure that all parts of the mesh are ;; generated as solids, this distance can not be zero, but the ;; solid can be SLICEd later if need be. ;; ;; The solid will match the displayed mesh: if the mesh has ;; been smoothed and SPLFRAME is set to 0, the solid will be ;; smoothed. Otherwise, it will not be. The mesh itself is not ;; changed at all. ;; (defun c:m2s (/ ent ename entlst M N MN SN SM ST smooth oldecho vtx d1 low vtxcnt vtxmax bot bottom p1 p2 p3 p4 c1 c2 c3 c4 b1 b2 b3 b4 soldepth ssall ssrow) (setq oldecho (getvar "cmdecho")) (setq oldsnap (getvar "osmode")) (setq oldblip (getvar "blipmode")) (setvar "cmdecho" 0) (setvar "osmode" 0) (setvar "blipmode" 0) (if (< 16 (atoi (substr (getvar "acadver") 1 2))) (setq R17 T)) (if R17 (setq oldsolidhist (getvar "solidhist"))) (command "_.undo" "_begin") ;;select the mesh (setq ent (entsel "Select a polygon mesh to solidify: ")) (setq ename (car ent)) (setq entlst (entget ename)) (if (not (= (cdr (assoc 0 entlst)) "POLYLINE")) (progn (alert "That is not a polygon mesh.") (exit) (princ) );progn );endif (if (not (or (= (cdr (assoc 70 entlst)) 16) ;open 3d polygon mesh (= (cdr (assoc 70 entlst)) 20) ;open mesh w/ spline-fit vertices );or );not (progn (alert "That is not an *open* polygon mesh.") (exit) (princ) );progn );endif ;; decide whether to use smoothed or unsmoothed vertices (setq M (cdr (assoc 71 entlst))) ;M vertices (setq N (cdr (assoc 72 entlst))) ;N vertices (setq SM (cdr (assoc 73 entlst))) ;smoothed M vertices (setq SN (cdr (assoc 74 entlst))) ;smoothed N vertices (setq ST (cdr (assoc 75 entlst))) ;surface type (if (or (= (getvar "splframe") 1) ;use MxN vertices when splframe = 1 (= ST 0) ;or mesh has not been smoothed ) (setq smooth 0 MN (* M N)) (setq smooth 1 ;use SMxSN vertices when mesh is smoothed MN (* SM SN) ;and SPLFRAME = 0 M SM N SN) );if ;; determine lowest vertex (grtext -2 "Examining the mesh...") (setq vtx ename) (setq vtx (entnext vtx)) (setq d1 (entget vtx)) (setq bottom (caddr (trans (cdr (assoc 10 d1)) 0 1))) (repeat (1- MN) ;compare with each vertex's z coord (setq vtx (entnext vtx)) (setq d1 (entget vtx)) (setq low (caddr (trans (cdr (assoc 10 d1)) 0 1))) (setq bottom (min bottom low)) );repeat ;; get desired thickness of solid (setq soldepth 0) (while (zerop soldepth) (progn (setq soldepth (getdist "\nEnter desired thickness of solid below lowest vertex <1>: ")) (if (not soldepth) (setq soldepth 1.0)) (if (zerop soldepth) (princ "\nThickness can be small, but not zero. (Slice it later, if need be.)")) );progn );while (setq bot (- bottom (abs soldepth))) (setq p1 ename) (if (= smooth 1) (setq p1 (entnext p1))) ;skip 1st vtx of smoothed mesh - not true vtx (setq ssrow (ssadd)) ;initialize set of extruded segments to be unioned as a row (setq ssall (ssadd)) ;initialize set of rows to be unioned into the whole (grtext -2 "Creating row...") (setq vtxmax (- MN N)) (setq vtxcnt 1) ;;create row of solid segments (while (< vtxcnt vtxmax) (if (= 0 (rem vtxcnt N)) ;at end of each row... (progn (setq rowmsg (strcat "Unioning row " (itoa (/ vtxcnt N)) " of " (itoa (1- M)) "... ")) (grtext -2 rowmsg) (command "_.union" ssrow "") (setq row (entlast)) (ssadd row ssall) (setq ssrow (ssadd)) (setq p1 (entnext p1) ;skip to the next vertex vtxcnt (1+ vtxcnt)) );progn );if (grtext -2 "Creating row...") (setq p1 (entnext p1) ;first vertex of mesh square p2 (entnext p1) ;second vertex p3 p2) (repeat (1- n) (setq p3 (entnext p3))) ;walk along to 3rd (p1 + N) vertex (setq p4 (entnext p3)) ;4th vertex of mesh square (setq c1 (trans (cdr (assoc 10 (entget p1))) 0 1) ;top coordinates c2 (trans (cdr (assoc 10 (entget p2))) 0 1) c3 (trans (cdr (assoc 10 (entget p3))) 0 1) c4 (trans (cdr (assoc 10 (entget p4))) 0 1) b1 (list (car c1) (cadr c1) bot) ;bottom coordinates b2 (list (car c2) (cadr c2) bot) b3 (list (car c3) (cadr c3) bot) b4 (list (car c4) (cadr c4) bot)) (LOFT c1 c2 c3 b1 b2 b3) (LOFT c2 c3 c4 b2 b3 b4) (setq vtxcnt (1+ vtxcnt)) );while (grtext -2 "Unioning last row...") (command "_.union" ssrow "") (setq row (entlast)) (ssadd row ssall) (if (> M 2) ;bypass final union for N x 1 meshes (i.e., RULESURF) (progn (grtext -2 "Unioning all rows...") (command "_.union" ssall "") );progn );if ;;cleanup (command "_.undo" "_end") (setvar "cmdecho" oldecho) (setvar "osmode" oldsnap) (setvar "blipmode" oldblip) (if R17 (setvar "solidhist" oldsolidhist)) (setq ssall nil ssrow nil) (princ) );defun ;;============== SUBROUTINES ==================== (defun LOFT (r1 r2 r3 s1 s2 s3 / e1 extr highest) (command "_.area" s1 s2 s3 "") (if (not (equal (getvar "area") 0.0 0.00000001)) (progn (command "_.pline" s1 s2 s3 "c") (setq highest (max (caddr r1) (caddr r2) (caddr r3))) (setq extr (- highest bot)) (if R17 (command "_.extrude" (entlast) "" extr) ;;2007 and higher (command "_.extrude" (entlast) "" extr 0.0) ;;2006 and below );endif (command "_.slice" (entlast) "" "_3points" r1 r2 r3 s1) (setq e1 (entlast)) (ssadd e1 ssrow) );progn );if );defun (princ "Mesh-to-Solid 2007 loaded. Type M2S to run the program.")
-
Super, je vais pouvoir mettre à jour STATVAR, un super LISP de Bonuscad. Merci pour le lien.
-
Salut, Un autre conseil, si je puis me permettre, au lieu d'une longue énumération de (setq x nil) pour les variables, tu peux les déclarer comme variables locales, elles seront automatiquement mise à nil au lancement du LISP et leurs valeurs, si elles en avaient une avant le lancement du LISP, sera restituée à la fin de celui-ci. (defun c:fe (/ pti pti1 resul fe fe2 p1 p2 d d1 rep p) .... )
-
Salut, Je ne veux faire de pub pour quiconque, surtout que je ne connais Keynux qu'a travers leur site. J'ai découvert cette marque en faisant des recherches sur les portables munis de cartes graphiques professionnelles (open GL) et d'écrans 17". Tous les modèles sont personnalisables, deux modèles peuvent être configurés avec une carte "nvidia quadro fx go 1400", un portabe (processeur Pentium M de 1.73 à 2.26 GHz) et un transportable (Processeurs AMD Athlon dual-core 64-bits de 2.00 à 2.40 GHz). C'est haut de gamme, donc plutôt cher.
-
Salut, Tu peux voir ici.
-
Nouvelle version (1.4) J'ai réparé deux petites choses : La mise à jour des attributs non-constants dans les blocs imbriqués (on ne sait jamais). Le déplacement du point d'insertion des blocs imbriqués en cas de changement d'échelle.
-
Des fois je me donnerais des calques !
-
lisp pour escalier droit et balanser
(gile) a répondu à un(e) sujet de cloclo26220 dans AutoCAD 2004
Est-tu sûr d'avoir bien copier tous le LISP et uniquement le LISP, chez moi çà marche, je viens d'essayer les deux. -
lisp pour escalier droit et balanser
(gile) a répondu à un(e) sujet de cloclo26220 dans AutoCAD 2004
Salut et bienvenue, Tu trouveras ici un long sujet sur le dessin des escaliers. Il contient deux LISP pour le calcul du balancement suivant deux méthodes différentes (je préfère le deuxième). -
Salut, il y a effectivement un problème de paranthèses dans le code donné par Patrick_35 (vla-InsertBlock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point '(0.0 0.0 0.0)) "Mon_Bloc" 1 1 1 0) En français : (vla-InsertBlock ... Insérer un bloc... (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))) dans l'espace objet, du document actif, de l'application AutoCAD (vlax-3d-point '(0.0 0.0 0.0)) transforme le point d'insertion sous forme de liste en variant "Mon_Bloc" 1 1 1 0) puis le nom du bloc, les échelles en X, Y et Z, et la rotation.
-
Salut, On peut aussi le faire en AutoLISP, en parcourant les tables des claques : (defun c:lock_but (/ ent lay) (while (not (setq ent (car (entsel "\nSélectionnez le calque à ne pas vérouiller: ") ) ) ) ) (setq lay (tblnext "LAYER" T)) (while lay (if (/= (cdr (assoc 8 (entget ent))) (cdr (assoc 2 lay))) (command "_-layer" "_lock" lay "" "") ) (setq lay (tblnext "LAYER")) ) (princ) )
-
Salut, Le LISP modifie les définitions de blocs et met à jours les blocs insérés dans le dessin. 1) "Toute la collection" c'est tous les blocs du dessin (ou du gabarit) qu'ils soient insérés ou non dans le dessin (toute la liste du déroulant de la boite de dialogue de la commande "Inserer"). "Tous les blocs" c'est tous les blocs insérés dans le dessin (sauf s'il sont sur des calques vérouillés). C'est un (ssget "_X" '((0 . "INSERT"))). 2) La mise à jour des attributs, comme celle des autres entités consistuant les blocs, ne concerne que les propriétés modifiées par le LISP (Calque 0, Couleur DuBloc, Type de ligne Dubloc ...). Merci.
-
Salut, Un pas à pas avec ce qui se passe à la ligne de commande. Tu cliques sur l'icone "Colorer des faces" : Commande: _solidedit Vérification automatique de l'édition des solides: SOLIDCHECK=1 Entrez une option d'édition des solides [Face/Arête/Corps/annUler/Quitter] : _face Entrez une option d'édition des faces [eXtruder/déPlacer/Rotation/Décalage/eFfiler/Supprimer/Copier/couLeur/mAtériau/a nnUler/Quitter] : _color Sélectionnez les faces ou [annUler/Supprimer]: Tu sélectionnes une (ou des) face(s) Sélectionnez les faces ou [annUler/Supprimer]:1 face trouvée. Sélectionnez les faces ou [annUler/Supprimer/TOUT]: Tu fais ENTER pour valider ta sélection Entrez une option d'édition des faces [eXtruder/déPlacer/Rotation/Décalage/eFfiler/Supprimer/Copier/couLeur/mAtériau/a nnUler/Quitter] : Tu fais ENTER Vérification automatique de l'édition des solides: SOLIDCHECK=1 Entrez une option d'édition des solides [Face/Arête/Corps/annUler/Quitter] : Tu fais ENTER
-
C'est un problème perso ou tu peux en dire plus ?...
-
Ah bon ?! Pas chez moi en tout cas :casstet: Je viens de passer quelques temps à consulter assez régulièrement l'aide aux développeurs sur 2007, je n'ai pas remarqué de traductions supplémentaires par rapport à ce qui l'était déjà. Ai-je loupé un truc ? http://img524.imageshack.us/img524/2098/aide1bz.png
-
Salut, Je confirme (un peu tard, j'étais occupé ailleurs), sur AutoCAD 2007, la distance dans l'espace objet fonctionne comme la cotation dans ce même espace : de manière "trans-spatiale" comme dirait Tramber. Pour avoir une distance précise d'un objet dans l'espace papier, on peut toujours s'accrocher à un autre objet (ligne ou cote) dessiné, lui, dans l'espace papier, en s'accrochant au premier. http://img47.imageshack.us/img47/741/dist0wc.png La ligne (rouge) fait 2000 unités la cote (bleue) est faite dans l'espace papier, la distance en s'accrochant aux extrémités des lignes de cote sera 200 si la fenêtre est à l'échelle 1/10.
