Aller au contenu

(gile)

Moderateurs
  • Compteur de contenus

    12 247
  • Inscription

  • Dernière visite

  • Jours gagnés

    209

Tout ce qui a été posté par (gile)

  1. Désolé, je ne connais pas le VBA, mais je propose un petit LISP (en VisualLISP, plus proche du VBA, il me semble). Il pourrait être un peu plus concis pour être utilisé tel quel, mais j'ai essayé de bien décomposer et de commenter abondamment, si ça peut aider pour une éventuelle traduction en VBA. Il fonctionne avec les polylignes "optimisées" (lwpolyline), donc à utiliser après conversion des polylignes "old style" avec la commande CONVERT (comme indiqué par Didier). NOTA : si les polylignes 2D ont été lissées ou splinées, la commande CONVERT ne les transformera pas en lwpolylignes. Un LISP (eh oui, encore...) de Bonuscad, ICI, convertit toutes les polylignes 2D en lwpolylignes. Après chargement, taper pt-cen pour lancer la comande. (defun c:pt-cen (/ AcDoc Space SelSet obj Region) ;; Pointeur sur le document actif (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))) ;; Pointeur sur l'espace actif (objet ou papier) (if (= (getvar "CVPORT") 1) (setq Space (vla-get-PaperSpace AcDoc)) (setq Space (vla-get-ModelSpace AcDoc)) ) ;; Ajout d'un jeu de sélection (vide) à la collection (setq SelSet (vla-add (vla-get-SelectionSets AcDoc) "Centroid_Sel_Set") ) ;; Sélection à l'écran (filtre les lwpolylignes fermées) (vla-SelectOnScreen SelSet (vlax-SafeArray-fill (vlax-make-SafeArray vlax-vbInteger '(0 . 1) ) '(0 70) ) (vlax-SafeArray-fill (vlax-make-SafeArray vlax-vbVariant '(0 . 1) ) (list "LWPOLYLINE" 1) ) ) ;; Pour tous les objets contenus dans le jeu de sélection (vlax-for obj SelSet ;; Création d'une région (setq Region (vlax-invoke Space 'addRegion (list obj))) ;; Création d'un point au centre de gravité (vlax-invoke Space 'addPoint (trans (vlax-safearray->list (vlax-variant-value (vla-get-Centroid (car Region))) ) 1 0 ) ) ;; Supression de la région (vla-delete (car Region)) );_ fin de vlax-for ;; Suppression du jeu de sélection de la collection (vla-delete SelSet) (princ) ) [Edité le 27/8/2006 par (gile)]
  2. (gile)

    Diviser/Mesurer 3D

    Petite précision tout de même, dans l'exemple précédent, la transposition fonctionne sur la matrice complète parceque le déplacement (translation) est nul : vecteur 0,0,0 (trois premiers termes de la quatrième colonne) et peut être transposé avec la dernière rangée (0 0 0 1). Si le déplacement n'est pas nul, pour trouver la matrice de transformation inverse, on transpose la matrice de dimension 3X3 constituée des 3 premiers termes des trois première rangées (échelle et rotations) et on applique cette nouvelle matrice au vecteur de déplacement (3 premiers termes de la dernière colonne) avec la fonction mxv (voir la fonction ReverseMatrix dans le sujet sur les matrices).
  3. (gile)

    Diviser/Mesurer 3D

    Bien sûr que non, c'était une taquinerie ;) À la première question, je n'utilise pas le produit vectoriel puis le vecteur normal du plan défini par trois points, c'est pour calculer le vecteur normal du plan que j'utilise le produit vectoriel. En fait, j'ai décomposé la routine Norm_3pts en deux routines (pensant que c'était plus clair): - v^v qui retourne le produit vectoriel de deux vecteurs, soit un vecteur perpendiculaire aux deux vecteurs passés comme argument. - Norm_3pts dont les arguments sont des points, calcule les vecteurs du premier au deuxième et du premier au toisième point, puis appelle v^v pour trouver le vecteur normal à ces deux là et en calcule le vecteur unitaire (de norme 1). À la deuxième question, la transposition d'une matrice (faire passer les rangées en colonnes) appliquée à une matrice de transformation permet de trouver la matrice de transformation inverse : Matrice de rotation de 30° sur l'axe Z au point 0,0,0 : ((0.866025 -0.5 0.0 0.0) (0.5 0.866025 0.0 0.0) (0.0 0.0 1.0 0.0) (0 0 0 1)) ou : 0.866 -0.5 0.0 0.0 0.5 0.866 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 La fonction trp (transpose) appliquée à la matrice précédente : (trp '((0.866025 -0.5 0.0 0.0) (0.5 0.866025 0.0 0.0) (0.0 0.0 1.0 0.0) (0 0 0 1))) retourne : ((0.866025 0.5 0.0 0.0) (-0.5 0.866025 0.0 0.0) (0.0 0.0 1.0 0.0) (0 0 0 1)) ou : 0.866 0.5 0.0 0.0 -0.5 0.866 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 qui est la matrice de transformation inverse : rotation de 330° (ou -30°) sur l'axe Z au point 0,0,0 C'est là un des intérêts de l'utilisation des matrices. [Edité le 26/8/2006 par (gile)]
  4. (gile)

    Pbm Icône CUI perso

    Salut, Ça ressemble à du bricolage, mais depuis l'arrivée des CUI, j'ai un peu arrété de jouer avec les boutons et icônes... J'essayerais "d'enregistrer sous ..." les icônes AutoCAD dans le dossier contenant les icônes personnalisées et d'indiquer ce chemin dans les propriétés de la commande correpondante du menu partiel.
  5. (gile)

    Diviser/Mesurer 3D

    Tu deviens un peu exigent, mais l'objection est acceptée ;) Je modifie à nouveau les codes. [Edité le 25/8/2006 par (gile)]
  6. (gile)

    Diviser/Mesurer 3D

    J'avais oublié la deuxième remarque : La liste déroulante contient tous les blocs de la collection qu'ils soient insérés ou non, donc je ne vois pas l'intérêt de la "case vide", la boite dialogue est faite pour éviter d'avoir à taper le nom du bloc.
  7. S'il s'agit aussi de supprimer les propriétés qui auraient pu être forcées (couleur, fonte, caractères gras, italique ou sous-ligné) : (defun c:mtxt2Std (/ ss n txt e_lst str) (while (not (setq ss (ssget '((0 . "MTEXT")))))) (repeat (setq n (sslength ss)) (setq txt (ssname ss (setq n (1- n))) e_lst (entget txt) str (cdr (assoc 1 e_lst)) ) (if (= "{" (substr str 1 1)) (progn (while (and (setq start (vl-string-search "\\" str)) (setq end (vl-string-search ";" str start)) ) (setq str (vl-string-subst "" (substr str (1+ start) (- end start -1)) str ) ) ) (if (= "\\L" (substr str 2 2)) (setq str (vl-string-subst "" (substr str 2 2) str ) ) ) (setq str (vl-string-right-trim "}" (vl-string-left-trim "{" str) ) e_lst (subst (cons 7 (getvar "TEXTSTYLE")) (assoc 7 e_lst) (subst (cons 1 str) (assoc 1 e_lst) e_lst) ) ) (entmod e_lst) ) ) ) (princ) )
  8. Salut, Je ne suis pas sûr d'avoir compris la question, mais s'il s'agit de remettre un (ou des) mtext dans le style de texte courant : (defun c:mtxt2cstyle (/ ss n txt e_lst) (while (not (setq ss (ssget '((0 . "MTEXT")))))) (repeat (setq n (sslength ss)) (setq txt (ssname ss (setq n (1- n))) e_lst (entget txt) e_lst (subst (cons 7 (getvar "TEXTSTYLE")) (assoc 7 e_lst) e_lst ) ) (entmod e_lst) ) (princ) )
  9. (gile)

    commande plandecoupe

    Ce bug semble réparé avec le SP1 EDIT : Hélas non :( [Edité le 25/8/2006 par (gile)]
  10. (gile)

    F2S : Face 3D -> Solide

    Bien sûr, Le fil dans le forum Autodesk > AutoCAD Groups > Visual LISP, AutoLISP and General Customization Issues et dans Customer Files (Attachments) Groups Et aussi le gentil mail qu'il m'a envoyé, nous avions eu quelques échanges pour la mise à jour de M2S2007 :
  11. Bill Gilliss, l'auteur de M2S, vient de mettre en téléchargement F2S un nouveau LISP qui fonctionne comme M2S, mais avec des Faces 3D non nécéssairement jointives. Le LISP propose de faire l'union des solides générés automatiquement ou manuellement pour éviter un plantage d'AutoCAD si les solides sont trop nombreux. Il est donc possible de "solidifier" des maillages polyfaces (récupérés avec 3dsin par exemple) après les avoir décomposés. Comme je n'ai que 2007 sous la main, et que 3dsout n'existe plus dans cette version, je n'ai testé sur que sur un petit nombre de faces de faces 3D (entité plutôt laborieuse à créer).
  12. (gile)

    Diviser/Mesurer 3D

    Salut, J'ai effectivement cherché à reproduire le fonctionnement des commandes originelles en ce qui concerne la saisie des données. Mais comme je pense comme toi que c'est aussi une amélioration, je modifie le code, de toute façon, si l'utilisateur tapait Enter, espace ou faisait un clic droit par mégarde, l'option "Annuler" de la boite de dialogue getblock permet de ré-entrer dans la boucle pour spécifier le nombre de segments ou le la longueur des segments.
  13. (gile)

    Nouveautés 2007

    Salut, Tu peux déjà voir ICI, et d'autres sujets dans le forum AutoCAD 2007, des nouveautés réjouissantes et d'autres beaucoup moins.
  14. (gile)

    Diviser/Mesurer 3D

    Alors je ne te fais pas attendre plus longtemps, je modifie getblock (lsp et dcl) dans le premier message. Tu as raison, la gestion des boites de dialogue avec le DCL est plutôt ingrate, mais avec ObjectDCL ça devrait être plus facile. Sinon, si ça peut te rassurer, je suis largué par certains codes de Patrick_35 (et d'autres).
  15. (gile)

    AutoCAD 2007 SP1

    Désolé, je viens d'essayer, le résultat sur une sélection est tout aussi désastreux après l'installation du SP1.
  16. (gile)

    ObjectDCL Open source ?

    D'après ce que j'ai compris de ce que j'ai pu lire (à trainer sur les forums anglo-saxons je me rends bien compte de la pauvreté de mon anglais) ODCL dans l'état actuel est compatible de 2000 à 2006 et Chad livre les codes sources pour que de généreux dévelloppeurs (des vrais, pas des bricoclos comme moi) assurent la maintenance et la mis à jour pour la compatibilité avec les nouvelles versions. Mais Tramber, qui semble plus bilingue que moi, pourrait nous en dire plus ...
  17. (gile)

    AutoCAD 2007 SP1

    Salut Tramber, Je n'ai pas rencontré le problème que tu évoques dans ton lien et je n'ai pas réussi à le reproduire. Si tu pouvais me faire parvenir un dessin qui pose problème, je ferais le test avant/après ( gilecantel(at)wanadoo.fr ). D'après le fichier readme, ce pack corrigerait pas mal de problèmes ...
  18. (gile)

    ObjectDCL Open source ?

    OUINN !!! Y'a pas encore la version pour AutoCAD 2007, et je n'ai celle là ... :(
  19. Salut, Il y a des réglages (gadgets à mon avis) pour les saillies d'arrêtes, le crénelage d'arrête et les arrêtes de silhouette, pour faire genre "crayoné à la main". Il me semble que par défaut ceux-ci sont activés en mode conceptuel. tu peux les atténuer ou les supprimer carrément (cases encadrées en rouge) : http://img246.imageshack.us/img246/6020/sanstitrefj9.png
  20. (gile)

    Diviser/Mesurer 3D

    Salut Bred, Je pense que ça serait un excellent exercice pour toi. ;) Tu pourrais ajouter un bouton dans la boite de dialogue de getblock qui lancerait la fonction (getfiled ...) Jusqu'à quand veux tu que je te laisses chercher avant de donner une solution ? [Edité le 24/8/2006 par (gile)]
  21. Salut, Si tu parles bien de la procédure donnée ICI, et si j'ai bien compris la question. Je vais essayer d'expliquer le fonctionnement du LISP M2S, puisque c'est là qu'il semble y avoir un soucis. Il est demandé à l'utilisateur de choisir une surface maillée puis de spécifier l'épaisseur du solide sous le point le plus bas. M2S projète chaque sommet de la maille spécifiée sur le plan parallèle au plan XY du SCU courant dont l'élévation est donnée par la hauteur sous le point le plus bas entrée par l'utilisateur. Chaque maille est constituée d'un quadrilatère pas forcément plan, M2S va donc, pour la projection de chaque maille sur le plan, créer deux polylignes fermées triangulaires constituant le quadrilatère coupé par l'une de ses diagonales. Chaque triangle est extrudé jusqu'au plus haut des sommets dont il est la projection puis coupé suivant le plan défini par ces trois sommets. les solides sont ensuite unis par rangées et les rangées entre elles. Cette explication un peu laborieuse est pour dire l'importance du choix de la position du SCU par rapport à la maille à solidifier, et de la hauteur entrée pour donner l'épaisseur voulue au solide. Dans le cas du limon de l'escalier de l'exemple cité, on positionne les 4 arcs "hélicoïdaux" sur les arrêtes du futur limon : http://img99.imageshack.us/img99/1333/limon1wc0.png On crée 2 surfaces réglées : http://img99.imageshack.us/img99/1741/limon2rh2.png On lance M2S sur la plus haute, en spécifiant une hauteur supérieur à la section verticale du limon (noter la position du SCU) : http://img165.imageshack.us/img165/2892/limon3ov8.png On lance M2S sur la face inférieure du limon, en spécifaient une hauteur supérieure à celle qui dépasse du premier solide : http://img220.imageshack.us/img220/4413/limon4eb7.png On soustrait le second solide du premier : http://img166.imageshack.us/img166/8293/limon5kb4.png
  22. Suite à ce sujet et à mes récentes découvertes sur les matrices de transformation, j'ai essayer d'un peu mieux aboutir le LISP que j'y proposais. Au delà du fait que la routine répare certains dysfonctionnements des commandes Diviser et Mesurer en 3D, elle répond à certains souhaits émis dans sujet cité. La longueur de l'objet sélectionné s'affiche sur la ligne de commande. Avec l'option bloc, - le choix du bloc se fait dans une liste déroulante - une option supplémentaire permet de choisir si le bloc est inséré par rapport au plan du SCU ou par rapport à celui de l'objet (SCO pour les objets 2D, plan défini par les dérivées première et seconde au point d'insertion pour les spline 3D, les hélices). Cette option n'est pas accessible pour les lignes et polylignes 3D (dérivée seconde = vecteur nul). Nouvelle version de getblock : - Possibilité de choisir un bloc non inséré dans le dessin à partir de la boite de dialogue standard d'AutoCAD - Réparé un bug avec l'insertion de points sur les lignes et polylignes 3D (25/08/06 10h50) - Pour lancer l'option "Bloc", taper ENTER, Espace ou clic droit à la place de "b" + ENTER - Possibilité d'entrer le nom du bloc (25/08/06 21h20) Version 1.1 (11/04/07) - affiche par défaut le dernier bloc inséré (INSNAME) Le fichier DCL à enregistrer sous getblock.dcl dans un dossier du chemin de recherche des fichiers de support. getblock:dialog{ label="Choisir un bloc"; initial_focus="bl"; :boxed_column{ :row{ :column{ spacer; :text{ label="Nom :"; alignment=left; } } :column{ :button{ label="Parcourir..."; key="wbl"; alignment=right; fixed_width=true; } spacer; } } :edit_box{ key="tp"; edit_width=25; } :popup_list{ key="bl"; edit_width=25; } spacer; } ok_cancel; } Le LISP,les sous routines sont communes aux deux commandes DIV3D et MES3D ;;; DIV3D et MES3D - Gilles Chanteau - 25/08/06 ;;; ;;; Fonctionnement similaire aux commandes DIVISER (_DIVIDE) et MESURER (_MEASURE) ;;; Les plus : ;;; - L'option "Bloc" permet l'insertion de bloc sur des objets "mesurables" quels que ;;; soient le SCO de l'objet et le SCU courant. ;;; - Une option supplémentaire : "Plan de référence pour l'insertion du bloc ?" ;;; permet de choisir si le bloc est inséré par rapport au plan XY du SCU courant ;;; [scu] ou par rapport à l'objet [Objet]. ;;; - Le choix du bloc se fait dans la liste déroulante d'une boite de dialogue. ;;; - La longueur de l'objet sélectionnée est affichée sur la ligne de commande. ;;; Getspace Retourne l'espace courant (Modèle ou Papier) (defun getSpace () (if (= (getvar "CVPORT") 1) (vla-get-PaperSpace (vla-get-ActiveDocument (vlax-get-acad-object)) ) (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)) ) ) ) ;;; Getblock (version 1.1) ;;; Retourne le nom du bloc entré ou choisi par l'utilisateur ;;; dans une liste déroulante de la boite de dialogue ou depuis la boite ;;; de dialogue standard d'AutoCAD ;;; Argument : le titre (string) ou nil (défaut : "Choisir un bloc") (defun getblock (titre / bloc n lst what_next dcl_id nom) (while (setq bloc (tblnext "BLOCK" (not bloc))) (setq lst (cons (cdr (assoc 2 bloc)) lst) ) ) (setq lst (acad_strlsort (vl-remove-if '(lambda (n) (= (substr n 1 1) "*")) lst) ) ) (setq dcl_id (load_dialog "Getblock.dcl")) (setq what_next 2) (while (>= what_next 2) (if (not (new_dialog "getblock" dcl_id)) (exit) ) (start_list "bl") (mapcar 'add_list lst) (end_list) (if titre (set_tile "box" titre) ) (or (and (setq n (vl-position (strcase (getvar "INSNAME")) (mapcar 'strcase lst) ) ) (setq nom (nth n lst)) ) (setq nom (car lst) n 0 ) ) (set_tile "bl" (itoa n)) (action_tile "bl" "(setq nom (nth (atoi $value) lst))") (action_tile "wbl" "(done_dialog 3)") (action_tile "tp" "(setq nom $value) (done_dialog 4)") (action_tile "accept" "(setq nom (nth (atoi (get_tile \"bl\")) lst)) (done_dialog 1)" ) (setq what_next (start_dialog)) (cond ((= what_next 3) (if (setq nom (getfiled "Sélectionner un fichier" "" "dwg" 0)) (setq what_next 1) (setq what_next 2) ) ) ((= what_next 4) (cond ((not (read nom)) (setq what_next 2) ) ((tblsearch "BLOCK" nom) (setq what_next 1) ) ((findfile (setq nom (strcat nom ".dwg"))) (setq what_next 1) ) (T (alert (strcat "Le fichier \"" nom "\" est introuvable.")) (setq nom nil what_next 2 ) ) ) ) ((= what_next 0) (setq nom nil) ) ) ) (unload_dialog dcl_id) nom ) ;;; V^V Retourne le produit vectoriel (vecteur) de deux vecteurs (defun v^v (v1 v2) (if (inters '(0 0 0) v1 '(0 0 0) 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))) ) ) ) ;;; NORM_3PTS retourne le vecteur normal du plan défini par 3 points (defun norm_3pts (org xdir ydir / norm) (foreach v '(xdir ydir) (set v (mapcar '- (eval v) org)) ) (mapcar '(lambda (x) (/ x (distance '(0 0 0) norm))) (setq norm (v^v xdir ydir)) ) ) ;;; Transpose une matrice -Doug Wilson- (defun trp (m) (apply 'mapcar (cons 'list m)) ) ;;; Ang (defun ang (if (and ( ang (ang ) ) ;;; DivMesInsert Insère le bloc (ou le point) suivant les options choisies (defun DivMesInsert (/ norm deriv2 ang mat ydir) (if (/= scu "Scu") (cond ((member (vla-get-ObjectName obj) '("AcDbArc" "AcDbCircle" "AcDbEllipse" "AcDbPolyline" "AcDb2dPolyline" ) ) (setq norm (vlax-safearray->list (vlax-variant-value (vla-get-Normal obj)) ) ) ) ((not (member (vla-get-ObjectName obj) '("AcDbLine" "AcDb3dPolyline") ) ) (setq deriv2 (vlax-curve-getSecondDeriv obj ins_par ) ) (setq ang (ang ) ) (if ( (setq norm (norm_3pts '(0 0 0) deriv1 deriv2)) (setq norm (norm_3pts '(0 0 0) deriv2 deriv1)) ) ) ) ) (if nom (progn (if (= scu "Scu") (progn (if (= algn "Non") (setq ang (angle '(0 0 0) (trans (getvar "UCSXDIR") 0 ucszdir) ) ) (setq ang (angle '(0 0 0) (trans deriv1 0 ucszdir)) ) ) (setq mat (mapcar '(lambda (v) (trans v 0 ucszdir)) (list (list (cos ang) (- (sin ang)) 0) (list (sin ang) (cos ang) 0) '(0 0 1) ) ) ) ) (if (= algn "Non") (setq ydir (norm_3pts '(0 0 0) norm (getvar "ucsxdir")) mat (trp (cons (norm_3Pts '(0 0 0) ydir norm) (cons ydir (cons norm mat) ) ) ) ) (setq mat (trp (list (mapcar '(lambda (x) (/ x (distance '(0 0 0) deriv1)) ) deriv1 ) (norm_3pts '(0 0 0) norm deriv1) norm ) ) ) ) ) (vla-TransformBy (vla-InsertBlock (getspace) (vlax-3d-point '(0 0 0)) nom 1 1 1 0 ) (vlax-tmatrix (append (mapcar '(lambda (v1 v2) (append v1 (list v2)) ) mat ins_pt ) (list '(0 0 0 1)) ) ) ) (setvar "INSNAME" nom) ) (vla-addPoint (getspace) (vlax-3d-point ins_pt)) ) ) ;;; Std_vl_err Redéfinition de *error* (defun std_vl_err (msg) (if (= msg "Fonction annulée") (princ) (princ (strcat "\nErreur: " msg)) ) (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)) ) (setq *error* m:err m:err nil ) (princ) ) ;;;******************************************************************;;; ;;; Div3D (defun c:div3D (/ AcDoc ucszdir ent obj pick long nb nom algn scu dist ins_pt ins_par deriv1 ) (vl-load-com) (setq m:err *error* *error* std_vl_err ) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) ucszdir (trans '(0 0 1) 1 0 T) ) (sssetfirst nil nil) (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-getEntity (list (vla-get-Utility AcDoc) 'obj 'pick "\nChoix de l'objet à diviser: " ) ) ) (prompt "*Incorrect*") (progn (if (vl-catch-all-error-p (vl-catch-all-apply 'vlax-curve-getEndParam (list obj)) ) (prompt "\nL'objet ne peut pas être divisé.*Incorrect*") (progn (setq long (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj) ) ) (prompt (strcat "\nLongueur de l'objet: " (rtos long))) (while (not (> 3268 nb 1)) (setq nb (getint "\nEntrez le nombre de segments ou : ") ) (if nb (if (not (> 3268 nb 1)) (prompt "\nNécessite un entier entre 2 et 32767, ou une option." ) ) (progn (setq nom (getblock nil)) (if nom (setq nb 2) (setq nb 0) ) ) ) ) (if nom (progn (initget "Oui Non") (setq algn (getkword "\nAligner le bloc avec l'objet ? [Oui/Non] : " ) nb 0 ) (if (not (member (vla-get-ObjectName obj) '("AcDbLine" "AcDb3dPolyline") ) ) (progn (initget "Objet Scu") (setq scu (getkword "\nPlan de référence pour l'insertion du bloc ? [Objet/Scu] : " ) ) ) (setq scu "Scu") ) (while (not (> 3268 nb 1)) (setq nb (getint "\nEntrez le nombre de segments: ")) (if (not (> 3268 nb 1)) (prompt "\nNécessite un entier entre 2 et 32767." ) ) ) ) ) (setq dist (/ long nb)) (vla-StartUndoMark AcDoc) (repeat (setq nb (1- nb)) (setq ins_pt (vlax-curve-getPointAtDist obj (* nb dist)) ins_par (vlax-curve-getParamAtDist obj (* nb dist)) deriv1 (vlax-curve-getFirstDeriv obj ins_par ) ) (DivMesInsert) (setq nb (1- nb)) ) (if (vlax-curve-isClosed obj) (progn (setq ins_pt (vlax-curve-getStartPoint obj) ins_par (vlax-curve-getStartParam obj) deriv1 (vlax-curve-getFirstDeriv obj ins_par ) ) (DivMesInsert) ) ) (vla-EndUndoMark AcDoc) ) ) ) ) (setq *error* m:err m:err nil ) (princ) ) ;;;******************************************************************;;; ;;; Mes3D (defun c:mes3D (/ AcDoc ucszdir obj pick long dist nom algn scu nb rest ins_pt deriv1) (vl-load-com) (setq m:err *error* *error* std_vl_err ) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) ucszdir (trans '(0 0 1) 1 0 T) ) (sssetfirst nil nil) (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-getEntity (list (vla-get-Utility AcDoc) 'obj 'pick "\nChoix de l'objet à mesurer: " ) ) ) (prompt "*Incorrect*") (progn (if (vl-catch-all-error-p (vl-catch-all-apply 'vlax-curve-getEndParam (list obj)) ) (prompt "\nL'objet ne peut pas être mesuré.*Incorrect*") (progn (setq pick (vlax-curve-getClosestPointToProjection obj (trans (vlax-SafeArray->list pick) 1 0) (mapcar '- (trans (getvar "viewdir") 1 0) (trans '(0 0 0) 1 0) ) ) long (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj) ) ) (prompt (strcat "\nLongueur de l'objet: " (rtos long))) (while (and (not (numberp dist)) (not nom)) (if (not (setq dist (getint "\nSpécifiez la longueur du segment ou : " ) ) ) (setq nom (getblock nil)) ) ) (if nom (progn (initget "Oui Non") (setq algn (getkword "\nAligner le bloc avec l'objet ? [Oui/Non] : " ) ) (if (not (member (vla-get-ObjectName obj) '("AcDbLine" "AcDb3dPolyline") ) ) (progn (initget "Objet Scu") (setq scu (getkword "\nPlan de référence pour l'insertion du bloc ? [Objet/Scu] : " ) ) ) (setq scu "Scu") ) (initget 7) (setq dist (getdist "\nSpécifiez la longueur du segment: ") ) ) ) (if ( (prompt "\nL'objet n'est pas assez long.") (progn (setq nb (fix (/ long dist))) (if ( (setq rest (rem long dist)) (setq rest nil) ) (vla-StartUndoMark AcDoc) (repeat nb (setq ins_pt (if rest (vlax-curve-getPointAtDist obj (+ (* (1- nb) dist) rest) ) (vlax-curve-getPointAtDist obj (* nb dist)) ) ins_par (if rest (vlax-curve-getParamAtDist obj (+ (* (1- nb) dist) rest) ) (vlax-curve-getParamAtDist obj (* nb dist)) ) deriv1 (vlax-curve-getFirstDeriv obj ins_par) ) (DivMesInsert) (setq nb (1- nb)) ) (vla-EndUndoMark AcDoc) ) ) ) ) ) ) (setq *error* m:err m:err nil ) (princ) )[Edité le 24/8/2006 par (gile)][Edité le 25/8/2006 par (gile)][Edité le 25/8/2006 par (gile)][Edité le 26/8/2006 par (gile)] [Edité le 11/4/2007 par (gile)]
  23. (gile)

    ObjectDCL Open source ?

    Le pack d'installation ne devrait pas tarder à être aussi en téléchargement voir ICI
  24. Re, (command "_.insert" "nom bloc" pause echX echY angle)
  25. Salut, Pour insérer ton bloc avec la fonction LISP command, il faut lui passer comme arguments tous les arguments que tu donnes quand tu fait -inserer à la ligne de commande : - le nom du bloc, le point d'insertion, le facteur d'échelle en X, celui en Y et l'angle de rotation : (command "_.insert" "nom bloc" pt_insertion echX echY angle) Pour l'aire et le périmètre, on suppose que la variable pline stocke une polyligne (récupérée par (entlast), (car (entsel)) ou autre), il est possible de se servir de la commande AIRE (_area) et de récupérer les valeurs dans les variables système AREA et PERIMETER : (command "_.area" "_object" pline) (setq perimetre (getvar "PERIMETER") aire (getvar "AREA") ) On peut aussi transformer le "nom d'entité" de la polyligne en "vla-object" et récupérer les propriétés "area" et "length" : (setq vla-pline (vlax-ename->vla-object pline) perimetre (vla-get-length vla-pline) aire (vla-get-area vla-pline)
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité