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. Salut, Je ne comprends pas la question. La routine appelle la commande "_BREAK" avec toutes ses options dont : "Premier point".
  2. 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) )
  3. 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 )
  4. (gile)

    xplode

    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').
  5. 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;
  6. 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.
  7. Tout pareil comme Tramber ;)
  8. 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.
  9. 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))
  10. Salut, Les versions LT ne supportent aucune programmation.
  11. (gile)

    arrayrect et arrayedit

    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) ) )
  12. (gile)

    arrayrect et arrayedit

    Salut, Les nouveaux réseaux sont des blocs dynamiques et, à ma connaissance, il n'est pas possible de les créer en LISP.
  13. ExcelAttribute a besoin qu'Excel soit installé pour fonctionner. Le programme utilise le processus Excel en cours ou en démarre un nouveau.
  14. (gile)

    ≠RESOLU DCL Introuvable

    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" ?
  15. (gile)

    ≠RESOLU DCL Introuvable

    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).
  16. 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(); }
  17. 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.
  18. 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é).
  19. (gile)

    Cylindre nombres d'aretes

    Salut, Regarde la variable système ISOLINES, tu peux aussi jouer avec DISPSILH pour afficher la silhouette.
  20. 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.
  21. (gile)

    Lisp marche plus sur 2016 !

    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) )
  22. Salut, Introduction à AutoLISP : section 16.5 da-code > AutoLISP > Fonction par genre > Tables > TBLNEXT
  23. (gile)

    Lisp marche plus sur 2016 !

    ; 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.
  24. (gile)

    Bloc dynamique et hachure

    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).
  25. (gile)

    Bloc dynamique et hachure

    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.
×
×
  • 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é