-
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)
-
MAPCOUP de Gilles : Coupure en gardant les ODs
(gile) a répondu à un(e) sujet de lecrabe dans Autodesk Map
Salut, Je ne comprends pas la question. La routine appelle la commande "_BREAK" avec toutes ses options dont : "Premier point". -
Salut, C'est bien que tu sois arrivé à tes fins tout seul. Un exemple qui utilise des fonctions issues de la bibliothèque MathGeom en bas de cette page pour éviter le SCU objet. ;; TRP ;; Transpose une matrice -Doug Wilson- ;; ;; Argument ;; m : une matrice (defun trp (m) (apply 'mapcar (cons 'list m))) ;; MXV ;; Applique une matrice de transformation à un vecteur -Vladimir Nesterovsky- ;; ;; Arguments- ;; m : une matrice ;; v : un vecteur (defun mxv (m v) (mapcar (function (lambda (r) (apply '+ (mapcar '* r v)))) m ) ) ;; MXM ;; Multiplie (combine) deux matrices -Vladimir Nesterovsky- ;; ;; Arguments ;; m : une matrice ;; v : une matrice (defun mxm (m q) (mapcar (function (lambda (r) (mxv (trp q) r))) m) ) ;; gc:TransformBy ;; Applique la matrice de transformation (4x4) au point ;; ;; Arguments ;; pt : un point ;; mat : une matrice 4x4 (defun gc:TransformBy (pt mat) ((lambda (m d) (mapcar '+ (mxv m pt) d) ) (list (list (caar mat) (cadar mat) (caddar mat)) (list (caadr mat) (cadadr mat) (caddr (cadr mat))) (list (caaddr mat) (cadr (caddr mat)) (caddr (caddr mat))) ) (list (cadddr (car mat)) (cadddr (cadr mat)) (cadddr (caddr mat)) ) ) ) ;; gc:BlockTransform ;; Retourne la matrice de transformation d'une référence de bloc. ;; Matrice 4x4 telle que renvoyée par nentsel. ;; ;; Argument ;; ename : le nom d'entité de la référence de bloc (defun gc:BlockTransform (ename / elst ang norm) (setq elst (entget ename) ang (cdr (assoc 50 elst)) norm (cdr (assoc 210 elst)) ) (append (mapcar (function (lambda (v1 v2) (append v1 (list v2)) ) ) (setq mat (mxm (mapcar (function (lambda (v) (trans v 0 norm T))) '((1. 0. 0.) (0. 1. 0.) (0. 0. 1.)) ) (mxm (list (list (cos ang) (- (sin ang)) 0.) (list (sin ang) (cos ang) 0.) '(0. 0. 1.) ) (list (list (cdr (assoc 41 elst)) 0. 0.) (list 0. (cdr (assoc 42 elst)) 0.) (list 0. 0. (cdr (assoc 43 elst))) ) ) ) ) (mapcar '- (trans (cdr (assoc 10 elst)) norm 0) (mxv mat (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 elst))))) ) ) ) '((0. 0. 0. 1.)) ) ) (defun c:rotmult (/ axe rot ss i br xform pt1 pt2) (if (and (progn (initget 1 "X Y Z") (setq axe (getkword "\nAxe de rotation [X/Y/Z]: ")) ) (setq rot (getangle "\nRotation: ")) (setq ss (ssget '((0 . "INSERT")))) ) (repeat (setq i (sslength ss)) (setq br (ssname ss (setq i (1- i))) xform (gc:BlockTransform br) pt1 (gc:TransformBy '(0. 0. 0.) xform) pt2 (cond ((= axe "X") (gc:TransformBy '(1. 0. 0.) xform)) ((= axe "Y") (gc:TransformBy '(0. 1. 0.) xform)) ((= axe "Z") (gc:TransformBy '(0. 0. 1.) xform)) ) ) (vla-Rotate3d (vlax-ename->vla-object br) (vlax-3d-point pt1) (vlax-3d-point pt2) rot ) ) ) (princ) )
-
Salut, Le problème vient du fait que tu as deux expressions (action_tile ...) pour la clé "modelspace" et deux pour "paperspace" Essaye comme ça : (defun C:testpopup (/ heightmodels heightpapers scalemodels scalepapers dcl wdcl dcl_id Ok) (setq heightmodels (list "" "13" "18" "25" "35")) (setq heightpapers (list "" "13" "18" "25" "35" "50" "70" "100")) (setq scalemodels (list "" "1" "2" "2.5" "4" "5" "10" "20" "25" "40" "50" "100" "200" "250" "400" "500" "1000" "2000" "2500" "4000" "5000" "10000" "20000" "25000" "40000" "50000" "100000" ) ) (setq scalepapers (list "" "PS")) (setq dcl (vl-filename-mktemp "tmp.dcl") wdcl (ol "w") ) (princ "Testpopuplist:dialog{ label = \"Test\"; : text { label = \"Test popup_list\"; } : row { : column { : radio_row { label = \"Tilemode\"; : radio_button { key = \"modelspace\"; label = \"ModelSpace\"; action = \"(setq mode 1)\"; } : radio_button { key = \"paperspace\"; label = \"PaperSpace\"; action = \"(setq mode 0)\"; } : spacer { height = 0.25; } } : column { label = \"Text Style Attributes\"; children_fixed_width = true; : popup_list { key = \"height\"; label = \"Height\"; alignment = centered; width = 25; } : popup_list { key = \"scale\"; label = \"Scale\"; alignment = centered; width = 25; } : spacer { height = 0.25; } } } } ok_cancel; }" wdcl ) (close wdcl) (setq dcl_id (load_dialog dcl)) (if (not (new_dialog "Testpopuplist" dcl_id)) (exit) ) (if (= (getvar "TILEMODE") 1) (set_tile "modelspace" "1") (set_tile "paperspace" "1") ) (start_list "height") (mapcar 'add_list heightmodels) (end_list) (start_list "scale") (mapcar 'add_list scalemodels) (end_list) (action_tile "modelspace" "(start_list \"height\") (mapcar 'add_list heightmodels) (end_list) (start_list \"scale\") (mapcar 'add_list scalemodels) (end_list)") (action_tile "paperspace" "(start_list \"height\") (mapcar 'add_list heightpapers) (end_list) (start_list \"scale\") (mapcar 'add_list scalepapers) (end_list)") (action_tile "accept" "(done_dialog 1)") (action_tile "cancel" "(done_dialog 0)") (setq Ok (start_dialog)) (unload_dialog dcl_id) (vl-file-delete dcl) Ok )
-
Salut, XPLODE est une commande définie en LISP. On peut donc l'appeler avec : (c:XPLODE) mais on ne peut pas lui passer de paramètres (à moins d'utiliser vla-SendCommand ce qui nécessiterait de passer tous les paramètres sous forme de chaînes et exclurait donc la possibilité d'utiliser 'pause').
-
Salut, AcColorSettings est une structure ObjectARX/C++, avec .NET, on accède à l'équivalent de la plupart de ces propriétés via la classe AcadPreferencesDisplay de l'interface COM. Ces propriétés utilise ce qu'on appelle les couleurs Ole (Ole colors) parce qu'utilisées par les logiciels Microsofts (Excel entre autre). les couleurs sont codées sous la forme d'un entier combinant 3 octets pour le rouge le vert et le bleu mais contrairement à ce qui se fait habituellement avec les couleurs RGB, le premier octet est affecté au rouge et le dernier au bleu (BGR). Les méthodes suivantes permettent de convertir les couleurs AutoCAD RGB en couleur Ole et inversement. public static Color FromOleColor(int oleColor) => Color.FromRgb( (byte)(oleColor << 24 >> 24), (byte)(oleColor << 16 >> 24), (byte)(oleColor << 8 >> 24)); public static int ToOleColor(Color color) => (color.Blue << 16) | (color.Green << 8) | color.Red;
-
[RESOLU] Importer un style de coupe et de détail
(gile) a répondu à un(e) sujet de LElemurien dans Débuter en LISP
Salut, À mon avis, ce n'est pas vraiment une tâche pour "Débuter en LISP". S'il n'y a pas des centaines de fichiers dans ton dossier, tu auras meilleur temps de le faire avec le Design Center. Sinon, les styles de vue en coupe et les styles de vue de détail sont stockés respectivement dans les dictionnaires ACAD_SECTIONVIEWSTYLE et ACAD_DETAILVIEWSTYLE qui se trouvent dans le dictionnaire des objets nommés. -
ROTATION3D uniquement selon le SCG
(gile) a répondu à un(e) sujet de Aleck_Ultimate dans AutoCAD, liste de souhaits
Tout pareil comme Tramber ;) -
LISP pour incrementation et attribut
(gile) a répondu à un(e) sujet de Charly Albisser dans Pour aller plus loin en LISP
Salut, Avec ces routines d'incrémentations, j'avais essayé de faire quelque chose de polyvalent. Je pense que pour un besoin spécifique, vouloir partir d'une routine polyvalente n'est certainement pas le plus simple. Si je comprends bien la demande, il s'agit d'insérer un bloc particulier avec deux attributs dont un doit être renseigné par l'utilisateur et l'autre incrémenté de 10 à chaque insertion. Autrement dit : on demande à l'utilisateur de spécifier la valeur de départ pour l'attribut à incrément et tant qu'il spécifie un point et la valeur de l'autre attribut, on insère le bloc avec ces valeurs et on incrémente. Ceci peut-être assez facilement implémenté en utilisant la fonction command pour insérer le bloc avec ATTREQ à 1 pour renseigner les attributs dans la même expression. -
[RESOLU] Forcer la couleur d'une entité
(gile) a répondu à un(e) sujet de Vincent P. dans Pour aller plus loin en LISP
Salut, Quand le groupe 62 n'existe pas, la valeur par défaut est ByLayer (256) il devrait donc suffire de supprimer les groupes 62; 420 et 430 (pas testé). (entmod (vl-remove-if '(lambda (x) (member (car x) '(62 420 430))) ent)) -
Salut, Les versions LT ne supportent aucune programmation.
-
Salut, Les réseaux dynamiques sont des blocs dynamiques dont la définition contient des références de blocs anonymes. La définition de ces références anonymes contient les entités sélectionnées lors de la construction du réseau. ;; la référence de bloc dynamique contenant le réseau (setq blockRef (entget (car (entsel "\nSélectionnez un réseau dynamique: ")))) ;; la définition du bloc dynamique (setq blockDef (tblsearch "block" (cdr (assoc 2 blockRef)))) ;; la première référence de bloc anonyme contenant les entités mises en réseau (setq nestedBlockRef (entget (cdr (assoc -2 blockDef)))) ;; la définition du bloc anonyme (setq nestedBlockDef (tblsearch "block" (cdr (assoc 2 nestedBlockRef)))) ;; la liste des entités contenues dans la définiton du bloc anonyme (setq ent (cdr (assoc -2 nestedBlockDef))) (while ent (setq lst (cons (entget ent) lst) ent (entnext ent) ) )
-
Salut, Les nouveaux réseaux sont des blocs dynamiques et, à ma connaissance, il n'est pas possible de les créer en LISP.
-
ExcelAttribute a besoin qu'Excel soit installé pour fonctionner. Le programme utilise le processus Excel en cours ou en démarre un nouveau.
-
Je répète : Les fichier DCL doivent être placés dans un répertoire des chemins de recherche d'AutoCAD (peu importe que ce soit le même que celui du LISP). Est-ce que le dossier C:\lisp est bien enregistré comme : "Chemin de recherche des fichiers de support en cours d'utilisation" ?
-
Salut, Les fichier DCL doivent être placés dans un répertoire des chemins de recherche d'AutoCAD (peu importe que ce soit le même que celui du LISP).
-
Utilisation des commandes
(gile) a répondu à un(e) sujet de Tallano dans ObjectARX/DBX, C++, .NET, RealDWG
Au temps pour moi, j'avais mal lu. Tu peux utiliser la méthode d'extension suivante écrite par Tony Tanzillo. Elle "expose" la méthode non publique RunCommand et fonctionne comme Editor.Command. // Tony Tanzillo (reflection free) // http://www.theswamp.org/index.php?topic=44191.msg494502#msg494502 // <summary> // Appelle une commande de manière synchrone. // </summary> // <param name="ed">L'instance de Editor à laquelle s'applique la méthode.</param> // <param name="args">Le nom de la commande suivi des options.</param> // <returns>Le statut de l'exécution de la commande.</returns> // <exception cref="System.ArgumentNullException">Lancée si l'instance à laquelle s'applique la méthode est null.</exception> public static PromptStatus Command(this Editor ed, params object[] args) { if (ed == null) throw new ArgumentNullException("ed"); return runCommand(ed, args); } static Func<Editor, object[], PromptStatus> runCommand = GenerateRunCommand(); static Func<Editor, object[], PromptStatus> GenerateRunCommand() { MethodInfo method = typeof(Editor).GetMethod( "RunCommand", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); ParameterExpression instance = Expression.Parameter(typeof(Editor), "ed"); ParameterExpression args = Expression.Parameter(typeof(object[]), "args"); return Expression.Lambda<Func<Editor, object[], PromptStatus>>( Expression.Call(instance, method, args), instance, args) .Compile(); } -
Utilisation des commandes
(gile) a répondu à un(e) sujet de Tallano dans ObjectARX/DBX, C++, .NET, RealDWG
Salut, Depuis AutoCAD 2015, il n'est plus nécessaire d'utiliser P/Invoke avec acedCmd. La classe Editor fournit deux méthodes Editor.Command() et Editor.CommandAsync() qui acceptent comme arguments des valeur typées comma string, int double, Point3d, SelectionSet, etc. ed.Command("_PLINE", new Point2d(10.0, 5.0)); Voir ce sujet et celui-ci. -
Salut, Pour ExcelAttribute, il faut débloquer le ZIP (clic droit > Propriétés > Général > Débloquer). Mais cette application fonctionne avec un processus Excel, pas avec OpenOffice. Dans tous les cas, pour des données aussi simples que des valeurs d'attributs, je persiste à penser que que des fichiers texte (.csv, .txt) sont bien plus simples, souples et rapides à utiliser tant du côté AutoCAD que du côté du tableur (pas de problème de compatibilité).
-
Salut, Regarde la variable système ISOLINES, tu peux aussi jouer avec DISPSILH pour afficher la silhouette.
-
[RESOLU] Est -il possible de refaire une boucle avec tblnext?
(gile) a répondu à un(e) sujet de LElemurien dans Débuter en LISP
Tu ne lis pas attentivement les documents. tblnext prend deux arguments, le second est optionnel et, s'il est spécifié et non nil, refait partir tblnext du premier élément de la table. -
Si tu veux juste changer le nom du bloc, il n'y a qu'un endroit où le faire : dans le LISP qui définit la commande à l'endroit où on définit la variable 'bloc'. (if (or (tblsearch "BLOCK" (setq bloc "sf")) (findfile (setq bloc "sf.dwg"))) Partout ailleurs, "Pline_block" sert de clé pour le dictionnaire qui mémorise le contenu de la liste déroulante dans la boite de dialogue getname (avec les fonctions vlax-data-*). Il faut bien entendu que cette clé soit la même dans le le LISP qui définit ma commande et dans getname. Ne modifie pas un code si tu ne comprends pas ce que tu fais, n'ajoute pas de balises BBcode dans les codes, et fait très attention à l'orthographe (quand on voit comment tu écris, ça fait un peu peur). (defun c:sf (/ AcDoc Space bloc nom ent obj ins op reg ech id long aire ref) (vl-load-com) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= (getvar "CVPORT") 1) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) (if (or (tblsearch "BLOCK" (setq bloc "sf")) (findfile (setq bloc "sf.dwg"))) (progn ;; attribut "nom de la pièce" (if (not (setq nom (getname "Nom de la pièce"))) (setq nom "") ) (while (not (setq ent (car (entsel))))) (setq obj (vlax-ename->vla-object ent)) (if (= "AcDbPolyline" (vla-get-ObjectName obj)) (progn (if (not (setq ins (getpoint "\nSpécifiez le point d'insertion ou < Centre >: "))) (progn (if (= (vla-get-closed obj) :vlax-false) (progn (vla-put-closed obj :vlax-true) (setq op T)) ) (setq reg (vlax-invoke space 'addRegion (list obj)) ins (vlax-get (car reg) 'Centroid) ) (if op (vla-put-closed obj :vlax-false) ) (vla-delete (car reg)) ) ) (if (not (vlax-ldata-get "Pline_block" "ech")) (vlax-ldata-put "Pline_block" "ech" 3) ) (if (not (setq ech (getreal (strcat "\nEntrez le facteur d'échelle <" (rtos (vlax-ldata-get "Pline_block" "ech")) ">: " ) ) ) ) (setq ech (vlax-ldata-get "Pline_block" "ech")) (vlax-ldata-put "Pline_block" "ech" ech) ) (setq id (vla-GetObjectIdString (vla-get-Utility AcDoc) obj :vlax-false) ;; Attribut périmètre (mm² -> m²) aire (strcat "Surface: " "%<\\AcObjProp Object(%<\\_ObjId " id ">%).Area \\f \"%lu2%pr2%ct8[1e-0]\">%" " m²" ) ;; Attribut surface (mm -> m) long (strcat "Perimétre: " "%<\\AcObjProp Object(%<\\_ObjId[/url] " id ">%).Length \\f \"%lu2%pr2%ct8[1.00]\">%" " ml" ) ) (setq ref (vla-InsertBlock Space (vlax-3d-point (trans ins 1 0)) bloc ech ech 1 (angle '(0 0 0) (trans (getvar 'ucsxdir) 0 (trans '(0 0 1) 1 0 T))) ) ) ;; attribution de leur valeur aux attributs (mapcar '(lambda (x y) (vla-put-TextString x y)) (vlax-invoke ref 'GetAttributes) (list nom aire long) ) (vla-regen AcDoc acActiveViewport) ) (alert "L'objet sélectionné n'est pas une polyligne.") ) ) (alert "Le bloc \"sf\" est introuvable.") ) (princ) )
-
[RESOLU] Est -il possible de refaire une boucle avec tblnext?
(gile) a répondu à un(e) sujet de LElemurien dans Débuter en LISP
Salut, Introduction à AutoLISP : section 16.5 da-code > AutoLISP > Fonction par genre > Tables > TBLNEXT -
; erreur: quitter / sortir abandon C'est parce que le LISP ne trouve pas le DCL. Il ne le trouve pas parce qu'il n'est pas dans un dossier des chemins de recherche. Toujours mettre les fichiers DCL dans des répertoires des chemins de recherche.
-
Si je comprends bien, tu fais un copier/coller Windows (Ctrl+C/Ctrl+V) de plusieurs entités dont des blocs dynamiques, l'ensemble constituant une coupe. Tu peux essayer de faire un bloc par coupe et d'utiliser une palette d'outils pour insérer ces blocs en les décomposant (clic droit sur le bloc dans la palette > Propriétés > Décomposer = Oui).
-
Oupss!... J'avais lu trop vite. toutes les hachures des blocs dynamiques reprennent leur taille d'origine (avant étirement) C'est le comportement normal quand on insère un bloc.
