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. Oupss!... Je me suis trompé de fichier zip. J'ai réparé le lien sur cette page.
  2. Salut, Le lien est réparé.
  3. Salut, Il est possible/probable que soit "une évolution du logiciel". Avec l'abandon de la fibre (AutoCAD 2015), le comportement d'AutoCAD lorsqu'on passe d'un document à un autre dans la même session a changé.
  4. Salut, Sous forme de fonction séparée (je savais bien que j'avais aussi quelque chose dans ce style...) ;; GetOrSelectString ;; Entrer un texte ou sélectionner une entité *TEXT ou ATTRIB ;; Retourne le texte (STR) ou nil ;; ;; Arguments ;; space : si non nil, autorise les espaces dans la saisie du texte ;; msg : message d'invite (defun GetOrSelectString (space msg / break gr pt txt elst str) (prompt msg) (while (and (setq gr (grread T 12 2)) (not break)) (cond ;; récupère les coordonnées du curseur ((= (car gr) 5) (setq pt (cadr gr)) ) ;; point cliqué ((= 3 (car gr)) (if (setq txt (nentselp pt)) (if (wcmatch (cdr (assoc 0 (setq elst (entget (car txt))))) "*TEXT,ATTRIB" ) (setq str (cdr (assoc 1 elst)) break T ) (prompt "\nL'object sélectionné n'est pas un texte ou un attribut.") ) (setq str nil break T ) ) ) ;; Clic droit ((member (car gr) '(12 25)) (setq str nil break T ) ) ;; Entrée ou Espace si 'space' = nil ((or (equal gr '(2 13)) (and (equal gr '(2 32)) (not space)) ) (if (and str (= (vl-string-trim " \t" str) "")) (setq str nil) ) (setq break T) ) ;; Récupérer les entrées au clavier (T (if (= (cadr gr) 8) ;_ 8 = retour/effacer (or (and str (/= str "") (setq str (substr str 1 (1- (strlen str)))) (princ (chr 8)) ; "\010" (princ (chr 32)) ; " " ) (setq str nil) ) (or (and str (setq str (strcat str (chr (cadr gr))))) (setq str (chr (cadr gr))) ) ) (and str (princ (chr (cadr gr)))) ;_ affichage sur la ligne de commande ) ) ) str ) Exemple d'utilisation : ;;;********************************************************** ;;; Teste de sélection d'une profondeur OU saisi de celle-ci ;;;********************************************************** (defun c:TestProf (/ Prof Phrase Txt_Prof) (setq Prof (vlax-ldata-get "DenisH" "EtiqPRD_OldProf" "")) (if (= Prof "") (setq Phrase (strcat "\nSélectionnez la profondeur : ")) (setq Phrase (strcat "\nSélectionnez la profondeur <" Prof "> : ")) ) (if (not (setq Txt_prof (GetOrSelectString nil Phrase))) (setq Txt_prof Prof) ) (alert (strcat "Txt_prof = " txt_prof)) (princ) )
  5. Salut, Juste une idée comme ça. AutoCAD utilise deux fichiers différents pour les hachures (comme pour les types de lignes) : acad.pat pour le système impérial acadiso.pat pour le système métrique En fonction de la valeur de la variable système MEASUREMENT, c'est dans l'un ou l'autre qu'AutoCAD cherche les motifs de hachures (idem pour les types de ligne .lin).
  6. Salut, J'ai fait, il y a peu, un LISP pour remplacer des rectangles (polyligne fermée rectangulaire) par des blocs dynamiques (c'était la demande). Je l'ai adapté pour fonctionner avec un simple bloc (rectangle de 1x1 unité) qui est inséré avec les échelles en X et Y correspondant aux dimensions de la polyligne remplacée. Le bloc, nommé "rectangle" par défaut (à modifier au besoin au début du code) est créé s'il n'existe pas dans le dessin. L'utilisateur est invité à spécifier un nom de calque. Toutes les polylignes rectangulaires sur ce calque sont remplacées par une référence de bloc. (defun c:rec2blk (/ *error* 2dVar2PtList midPt tryGetRectangle replaceByBlock makeBlock blkName layName ss rect rectangs org len wid rot ) ;; remplacer "rectangle" par le nom du bloc souhaité (setq blkName "rectangle") (vl-load-com) (or *acad* (setq *acad* (vlax-get-acad-object))) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*))) (or *blocks* (setq *blocks* (vla-get-Blocks *acdoc*))) (or *layers* (setq *layers* (vla-get-Layers *acdoc*))) (defun *error* (msg) (and msg (/= msg "Fonction annulée") (prompt (strcat "\nErreur: " msg)) ) (vla-EndUndoMark *acdoc*) (princ) ) ;; Convertit une liste de coordonnées 2d en liste de points 2d (defun 2dVar2PtList (lst) (if lst (cons (list (car lst) (cadr lst)) (2dVar2PtList (cddr lst))) ) ) ;; Retourne le milieu de deux points (defun midPt (p1 p2) (mapcar (function (lambda (x1 x2) (/ (+ x1 x2) 2.))) p1 p2) ) ;; Evalue si les points tournent dans le sens horaire (defun clockwise-p (p1 p2 p3) (< (sin (- (angle p1 p3) (angle p1 p2))) -1e-14) ) ;; Evalue si la polyligne est rectangulaire et retourne les données du rectangle (defun tryGetRectangle (pline / pts org len wid rot) (if (and (= (vla-get-closed pline) :vlax-true) (setq pts (2dVar2PtList (vlax-get pline 'Coordinates))) (= (length pts) 4) (equal (distance (car pts) (caddr pts)) (distance (cadr pts) (cadddr pts)) 1e-9 ) (equal (midPt (car pts) (caddr pts)) (midPt (cadr pts) (cadddr pts)) 1e-9 ) ) (progn (if (clockwise-p (car pts) (cadr pts) (caddr pts)) (setq pts (reverse pts)) ) (setq org (car (vl-sort pts (function (lambda (p1 p2) (if (= (cadr p1) (cadr p2)) (< (car p1) (car p2)) (< (cadr p1) (cadr p2)) ) ) ) ) ) ) (cond ((equal org (car pts)) (setq len (distance org (cadr pts)) wid (distance org (cadddr pts)) rot (angle org (cadr pts)) ) ) ((equal org (cadr pts)) (setq len (distance org (caddr pts)) wid (distance org (car pts)) rot (angle org (caddr pts)) ) ) ((equal org (caddr pts)) (setq len (distance org (cadddr pts)) wid (distance org (cadr pts)) rot (angle org (cadddr pts)) ) ) (T (setq len (distance org (car pts)) wid (distance org (caddr pts)) rot (angle org (car pts)) ) ) ) (list org len wid rot) ) ) ) ;; Remplace la polyligne par un bloc (defun replaceByBlock (pline rect blkName layName / org len wid rot ins blk) (mapcar 'set '(org len wid rot) rect) (setq ins (list (car org) (cadr org) (vla-get-Elevation pline)) blk (vla-InsertBlock (vla-get-ModelSpace *acdoc*) (vlax-3d-point ins) blkName len wid 1.0 rot ) ) (vla-put-Normal blk (vla-get-Normal pline)) (vla-put-Layer blk layName) ) ;; Crée la définition de bloc (defun makeBlock (blkName / blk) (setq block (vla-Add *blocks* (vlax-3d-point '(0. 0. 0.)) blkName)) (setq pline (vlax-invoke block 'AddLightWeightpolyline '(0. 0. 1. 0. 1. 1. 0. 1.) ) ) (vla-put-Closed pline :vlax-true) (vla-put-Layer pline "0") ) ;; Fonction principale (vla-StartUndoMark *acdoc*) (or (tblsearch "block" blkName) (makeBlock blkName) ) (if (and (setq layName (getstring T "\nEntrer le nom du calque: ")) (tblsearch "layer" layName) ) (if (ssget "_X" (list (cons 0 "LWPOLYLINE") (cons 8 layName) (cons 410 "Model") ) ) (progn (vlax-for pline (setq ss (vla-get-ActiveSelectionSet *acdoc*)) (if (setq rect (tryGetRectangle pline)) (progn (replaceByBlock pline rect blkName layName) (vla-Delete pline) ) ) ) (vla-Delete ss) ) ) (prompt (strcat "\nLe calque '" layName "' n'existe pas.")) ) (*error* nil) )
  7. Salut, Tu n'étais pas loin. Il ne faut pas hésiter à tester une expression (command ...) en changeant les paramètres en fonction de ce que renvoie la ligne de commande. (command "_.pedit" (entlast) "_width" 0.4 "") Après, une façon plus "programmation" serait de modifier la polyligne via ses propriétés : avec AutoLISP et les données DXF (setq elst (entget (entlast))) ; liste des données dxf de la dernière entité (entmod (subst '(43 . 0.4) (assoc 43 elst) elst)) avec setpropertyvalue (AutoCAD 2012 et +) (setpropertyvalue (entlast) "ConstantWidth" 0.4) avec "Visual LISP" (COM/ActiveX) (vla-put-ConstantWidth (vlax-ename->vla-object (entlast)) 0.4)
  8. Salut, Je suis entièrement d'accord avec x_all, le plus simple serait de te retourner vers le BE pour qu'il te fournisse un DWG exploitable. Je sais que certains sont tellement jaloux de leur travail qu'ils ne veulent pas fournir de DWG contenant leurs blocs (voire ne pas fournir de DWG utilisable). On en a même vu, ici, demander une routine pour décomposer tous les blocs d'un dessin. Personnellement, j'ai toujours refusé de le faire. Continuer à travailler avec des BE qui font ça délibérément est, à mon avis, contre productif...
  9. (gile)

    Distance point/droite

    Salut, Juste une remarque, quand tu fais : (angtos (+ (angle pt1 pt2) (/ pi 2))) tu ajoutes pi/2 radians (ou 90°, ou 100gr) à l'angle. Je suppose que tu as besoin de faire ça parce que dans ton dessin la variable ANGBASE vaut pi/2 radians (ou 90°, ou 100gr), mais tout le monde ne paramètre pas ses dessins comme ça, donc si tu veux que ton programme fonctionne quelle que soit la valeur de ANGBASE, il vaut mieux faire: (angtos (+ (angle pt1 pt2) (getvar "ANGBASE")))
  10. (gile)

    Distance point/droite

    Il faut garder en mémoire qu'AutoCAD (comme tous les calculateurs géométriques qui utilisent des angles) travaille toujours en radians. La fonction LISP angle, par exemple, retourne un angle en radians. Il faut aussi garder en mémoire que la fonction command (comme les fonctions get* qui utilisent aussi l'éditeur AutoCAD) utilisent les paramètres courants (unités angulaire, SCU courant, etc.). Donc, dans ton cas, les points récupérés avec getpoint sont bien définis dans le SCU courant donc utilisables tels quels dans un appel de commande. (angle pt1 pt2) retourne l'angle en radians entre pt1 et pt2 (dans le SCU courant). Il s'agit donc de convertir cet angle dans l'unité angulaire courante. Comme la fonction command accepte les chaînes de caractères comme argument, la fonction angtos est directement utilisable : (command-s "_insert" Bloc Pt5 "_x" Long "_y" Larg "_rotation" (angtos (angle pt1 pt2)))
  11. (gile)

    Distance point/droite

    Oups!... Pour la distance 2D, j'avais oublié le cas des droites verticales qui provoquent une division par 0. (defun dist2d (pt p1 p2 / a b ) (if (= (car p2) (car p1)) ; droite vericale : x = constante (abs (- (car pt) (car p1))) (progn ;; valeurs a et b de l'équation de la droite y = ax + b (setq a (/ (- (cadr p2) (cadr p1)) (- (car p2) (car p1))) b (- (cadr p1) (* a (car p1))) ) (/ (abs (+ (* a (car pt)) (- (cadr pt)) b )) (sqrt (+ (* a a) 1.)) ) ) ) )
  12. (gile)

    Distance point/droite

    Salut Deux petites routine extraite de la bibliothèque MathGeom.lsp sur cette page. ;; gc:DistanceTo ;; Retourne la distance du point pt à la droite p1 p2 ;; ;; Arguments ;; pt : le point extérieur à la droite ;; p1 : un point sur la droite ;; p2 : un point sur la droite (defun gc:DistanceTo (pt p1 p2) ((lambda (v) (/ (distance '(0. 0. 0.) (gc:CrossProduct (mapcar '- pt p1) v)) (distance '(0. 0. 0.) v) ) ) (mapcar '- p2 p1) ) ) ;; gc:CrossProduct ;; Retourne le produit vectoriel (vecteur) de deux vecteurs ;; Arguments ;; v1, v2 : deux vecteurs (defun gc:CrossProduct (v1 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))) ) ) La routine gc:DistanceTo ci-dessus fonctionne dans l'espace (3D), pour la distance entre un point et une droite du plan (2D), on peut faire plus simple : (defun dist2d (pt p1 p2 / a B) ;; valeurs a et b de l'équation de la droite y = ax + b (setq a (/ (- (cadr p2) (cadr p1)) (- (car p2) (car p1))) b (- (cadr p1) (* a (car p1))) ) (/ (abs (+ (* a (car pt)) (- (cadr pt)) B)) (sqrt (+ (* a a) 1.)) ) )
  13. (gile)

    lisp surface

    Salut, Regarde ici.
  14. Salut, Je confirme un problème pour l'accès aux screencasts.
  15. (gile)

    export espace papier

    Salut, Ctrl+2
  16. (gile)

    Autocad l'escargot ?

    Re, Le "nouveau réseau" apparu avec AutoCAD 2012 est, à mon avis, l'exemple type du gadget : ça en jette à l'écran mais ça n'apporte rien ou pas grand chose en terme de productivité (à tel point que pour répondre aux demandes des utilisateurs le service pack 1 d'AutoCAD 2012 réintégrait le réseau classique avec la commande RESEAUCLASSIQUE / _CLASSICARRAY). Je serais curieux de savoir : combien d'utilisateurs utilisent les "vraies nouveautés" de ces réseaux (angle, niveaux, incrément d'élévation) ; combien d'utilisateurs utilisent les poignées dynamiques pour paramétrer un réseau plutôt que d'entrer au clavier les valeurs pour le nombre de lignes/colonnes, l'espacement entre les lignes/colonnes ; combien ne décomposent pas le réseau une fois terminé.
  17. (gile)

    Autocad l'escargot ?

    Salut, Je ne constate aucune différence entre AutoCAD 2014 et AutoCAD 2017 (AutoCAD 'de base' 64 bits) pour décomposer un réseau de 100x100 cercles. PS : je n'ai jamais aimé ces nouveaux réseaux dynamiques (qu'on décompose quasi systématiquement) et je continue à utiliser le "réseau classique" (commande RESEAUCLASSIQUE ou _ARRAYCLASSIC).
  18. (gile)

    sélection de blocs

    Salut, Il n'y a pas de fonction LISP qui fasse ça directement. Un moyen est de sélectionner tous les blocs "B" pour récupérer leurs points d'insertion puis de sélectionner tous les blocs "A" et supprimer du jeu de sélection ceux dont le point d'insertion n'est pas dans la liste. (defun c:test (/ ssB i pts ssA) ;; sélectionner tous les blocs "B" (setq ssB (ssget "_X" '((0 . "INSERT") (2 . "B")))) ;; collecter tous les points d'insertion des blocs "B" (repeat (setq i (sslength ssB)) (setq pts (cons (cdr (assoc 10 (entget (ssname ssB (setq i (1- i)))))) pts ) ) ) ;; sélectionner tous les blocs "A" (setq ssA (ssget "_X" '((0 . "INSERT") (2 . "A")))) ;; suppimer du je de sélection les blocs "A" dont le point d'insertion ;; n'est pas dans liste des points d'insertions des blocs "B" (repeat (setq i (sslength ssA)) (setq a (ssname ssA (setq i (1- i)))) (if (not (member (cdr (assoc 10 (entget a))) pts)) (ssdel a ssA) ) ) ;; gripper le jeu de sélection "A" (sssetfirst nil ssA) (princ) ) On peut aussi faire la même chose en utilisant un jeu de sélection construit avec les points d'insertion des blocs "B". (defun c:test (/ ssB filter i) ;; sélectionner tous les blocs "B" (setq ssB (ssget "_X" '((0 . "INSERT") (2 . "B")))) ;; construire un filtre de sélection (setq filter '((-4 . "OR>"))) ;; avec tous les points d'insertion des blocs "B" (repeat (setq i (sslength ssB)) (setq filter (cons (assoc 10 (entget (ssname ssB (setq i (1- i))))) filter ) ) ) ;; pour sélectionner les blocs "A" (setq filter (vl-list* '(0 . "INSERT") '(2 . "A") '(-4 . "<OR") filter ) ) ;; sélectionner et gripper les blocs "A" (sssetfirst nil (ssget "_X" filter)) (princ) )
  19. (gile)

    dessiner un angle

    Salut, Il y a aussi le tuto de Patrick (grand gourou, créateur de CADxp) : Travailler en 3D avec AutoCAD.
  20. Salut, Effectivement la fonction command ne fait pas automatiquement basculer dans AutoCAD comme le font les fonctions get*. Pour basculer d'une fenêtre à une autre dans Windows, tu peux faire Ctrl+Tab. Donc dans l'éditeur quand tu as le curseur "bizzare" qui indique qu'une action est en cours dans la fenêtre d'AutoCAD, il te suffit de basculer vers AutoCAD par Ctrl+Tab.
  21. Salut, Pour modifier la vue dans une fenêtre, il faut jouer sur les propriétés ViewDirection et TwistAngle de l'objet viewport. Ceci peut se faire indépendamment du SCU (autrement dit, on n'est pas obligé de modifier le SCU dans la fenêtre pour en changer la vue). Comme les données sont stockées dans un SCU nommé on pourrait simplement récupérer ces données. private void SetUcsToViewport (Document doc, string layoutName, string ucsName) { var db = doc.Database; var ed = doc.Editor; using (var tr = db.TransactionManager.StartTransaction()) { var layoutDict = (DBDictionary)tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead); if (!layoutDict.Contains(layoutName)) { ed.WriteMessage($"\nPrésentation '{layoutName}' introuvable."); return; } var ucsTable = (UcsTable)tr.GetObject(db.UcsTableId, OpenMode.ForRead); if (!ucsTable.Has(ucsName)) { ed.WriteMessage($"\nSCU nommé '{ucsName}' introuvable."); return; } var layout = (Layout)tr.GetObject(layoutDict.GetAt(layoutName), OpenMode.ForRead); var btr = (BlockTableRecord)tr.GetObject(layout.BlockTableRecordId, OpenMode.ForRead); // récupérer la fenêtre de la présention var viewports = btr.Cast<ObjectId>() .Where(id => id.ObjectClass.DxfName == "VIEWPORT") .Select(id => (Viewport)tr.GetObject(id, OpenMode.ForRead)) .Where(vp => vp.Number != 1); if (!viewports.Any()) { ed.WriteMessage($"\nAucune fenêtre dans la présentation '{layoutName}'."); return; } LayoutManager.Current.CurrentLayout = layoutName; var viewport = viewports.First(); // récupérer le SCU nommé var ucsRecord = (UcsTableRecord)tr.GetObject(ucsTable[ucsName], OpenMode.ForRead); var zAxis = ucsRecord.XAxis.CrossProduct(ucsRecord.YAxis); // affecter le SCU à la fenêtre (pas indispensable pour modifier la vue) ed.SwitchToModelSpace(); Application.SetSystemVariable("CVPORT", viewport.Number); ed.CurrentUserCoordinateSystem = Matrix3d.AlignCoordinateSystem( Point3d.Origin, Vector3d.XAxis, Vector3d.XAxis, Vector3d.ZAxis, ucsRecord.Origin, ucsRecord.XAxis, ucsRecord.YAxis, zAxis); ed.SwitchToPaperSpace(); // modifier la vue dans la fenêtre viewport.UpgradeOpen(); viewport.ViewDirection = zAxis; viewport.TwistAngle = -ucsRecord.XAxis.AngleOnPlane(new Plane(Point3d.Origin, zAxis)); tr.Commit(); } }
  22. (gile)

    AutoCAD 2018 (Omega) GO !!

    Est-ce que ne plus évoluer c'est être mort ? Le violon (en tant qu'objet de lutherie) n'a quasiment plus évolué depuis le début du XVIIIème siècle, doit on penser qu'il est mort ou qu'il est abouti ?...
  23. (gile)

    AutoCAD 2018 (Omega) GO !!

    Un peu de patience... Autodesk ne publie les plugins pour chaque nouvelle version qu'une fois testés par l'auteur et par eux. Par exemple, je viens de leur soumettre une version d'OsnapPalette compatible avec 2018, il faut donc attendre qu'ils fassent leurs test et la publie (je pourrais utiliser une beta pour tester et soumettre avant la sortie de chaque nouvelle version, mais je pense qu'en le faisant au plus tôt avec la version finale, je ne pénalise pas trop les utilisateurs).
  24. (gile)

    AutoCAD 2018 (Omega) GO !!

    Salut, NDA = Non Disclosure Agreement soit "accord de non divulgation" auquel sont tenus les beta testeurs qui ont eu la primeur des nouveautés de cette version.
×
×
  • 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é