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. PS : pour la création de MNT avec AutoCAD, voir ce sujet.
  2. Autrement dit : pour le quadrilatère projeté horizontalement, on choisi la diagonale la plus courte (b, d) :.
  3. Une petite illustration avec deux épures de géométrie descriptive. Sur l'épure de gauche le point p est projeté sur la face (a, b, d), sur l'épure de droite il est projeté sur la face (a, b, c).
  4. Salut, Je ne comprends pas bien la question (surtout avec initget qui est instancié par le programme est n'est actif que pour la première fonction get... suivant l'expression initget). Sinon, il y a bin-list dans la bibliothèque MathGeom.lsp, en bas de cette page.
  5. Un exemple vite fait en VisualLISP (mêmes fonctions qu'en VBA) qui dessine des cercles de 1 unité de rayon sur les intersections entre les deux blocs sélectionnés. (vl-load-com) (or *acad* (setq *acad* (vlax-get-acad-object))) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*))) (defun c:test (/ f e1 e2 l1 l2) (defun f (l) (if l (cons (list (car l) (cadr l) (caddr l)) (f (cdddr l))) ) ) (if (and (setq e1 (car (entsel "\nSélectionnez le premier bloc: "))) (setq e1 (vlax-ename->vla-object e1)) (= (vla-get-ObjectName e1) "AcDbBlockReference") (setq e2 (car (entsel "\nSélectionnez le second bloc: "))) (setq e2 (vlax-ename->vla-object e2)) (= (vla-get-ObjectName e2) "AcDbBlockReference") (setq l1 (vlax-invoke e1 'Explode)) (setq l2 (vlax-invoke e2 'Explode)) ) (progn (vl-catch-all-apply '(lambda (/ pts ms) (setq ms (vla-get-ModelSpace *acdoc*)) (foreach o1 l1 (foreach o2 l2 (foreach p (f (vlax-invoke o1 'IntersectWith o2 acExtendNone)) (vla-put-Color (vla-AddCircle ms (vlax-3d-Point p) 1.0) 1) ) ) ) ) ) (foreach o l1 (vla-Delete o)) (foreach o l2 (vla-Delete o)) ) ) (princ) )
  6. Essayez la méthode Explode avec un bloc, elle ajoute les composant à l'espace propriétaire du bloc et renvoie les liste de ces objets, mais elle ne supprime pas la référence de bloc source, donc pas besoin de copie.
  7. Pour les blocs, IntersectWith considère l'emprise (BoundingBox). À mon avis, le plus simple pour chercher les intersections entre les composants de deux blocs est de décomposer les blocs. La méthode Explode renvoie un tableau d'objets, on cherche les intersections entre les composants d'un bloc et ceux de l'autre puis on supprime ces objets (Delete).
  8. Salut, IntersectWith.
  9. Salut, J'ai supprimé toutes les contraintes (tant que faire se peut, il vaut mieux éviter ces contraintes qui alourdissent significativement les blocs). J'ai ajouté une action d'étirement sur le paramètre Distance1 avec 0.5 comme valeur de "Variateur de distance" (propriétés de l'action d'étirement). BlocDyDoucheBaignoire.dwg
  10. Salut, Je vais essayer d'être clair sans être désobligeant. J'ai essayé de faire en sorte que les routines que j'ai donné ici (ou sur gileCAD) soient polyvalentes pour répondre à des besoins généraux, à côté de ça, je pense avoir toujours essayé d'aider ceux qui voulaient apprendre AutoLISP. Mais je n'ai aucune intension d'adapter ces routines pour des besoins particulier (écrire des programmes sur mesure, c'est mon gagne pain), libre à chacun d'apprendre AutoLISP et de les adapter.
  11. Le Xrecord du filtre actif (et lui seul) a un groupe DXF (290 . 1).
  12. Salut, Je ne veux pas te priver du plaisir d'explorer la structure des filtres de calque, je vais donc essayer de juste te donner des pistes. Schématiquement, ça se présente comme ça : Table des calques |_Dictionnaire d'extension |_Dictionnaire "ACAD_LAYERFILTERS" |_Dictionnaire "ACAD_LAYERSTATES" |_Dictionnaire "ACLYDICTIONARY" |_Xrecord "*A1" |_Xrecord "*A2" |_Dictionnaire d'extension |_Dictionnaire "ACLYDICTIONARY" |_Xrecord "*A1" ... Avec quelques routines de la bibliothèque Dictionaries sur cette page, on peut parcourir récursivement cette arborescence de façon plus "lisible". ;; gc:GetExtDict (gile) ;; Retourne le dictionnaire d'extension de l'entité (ou nil) ;; ;; Argument : ent (ENAME) (defun gc:GetExtDict (ent) (cdadr (member '(102 . "{ACAD_XDICTIONARY") (entget ent))) ) ;; gc:GetDictEntries ;; Retourne la liste des entrées du dictionnaire ;; sous forme de paires pointées (Nom . ENAME) ;; ;; Argument : dict le dictionnaire (ENAME ou liste DXF) (defun gc:GetDictEntries (dict / result) (and (= (type dict) 'ENAME) (setq dict (entget dict))) (while (setq dict (vl-member-if (function (lambda (x) (= (car x) 3))) (cdr dict))) (setq result (cons (cons (cdar dict) (cdadr dict)) result)) ) (reverse result) ) (defun getSymbolTable (table) (cdr (assoc 330 (entget (tblobjname table (cdr (assoc 2 (tblnext table T))))))) ) (defun getFilters (/ traverse layerTable) (defun traverse (xdict / dict) (if (and xdict (setq dict (cdr (assoc "ACLYDICTIONARY" (gc:GetDictEntries xdict)))) ) (mapcar '(lambda (x) (cons x (traverse (gc:GetExtDict (cdr x)))) ) (gc:GetDictEntries dict) ) ) ) (setq layerTable (cdr (assoc 330 (entget (tblobjname "layer" "0"))))) (traverse (gc:GetExtDict layerTable)) ) Pour une structure comme celle ci-dessus getFilters renvoie : ((("*A1" . <Nom d'entité: 27a10c510a0>)) (("*A2" . <Nom d'entité: 27a10c510c0>) (("*A1" . <Nom d'entité: 27a10c51100>)))) Un entget sur chaque ename te permettra de retrouver le nom du filtre, sa "formule" etc. Sinon, dans la pratique, tu peux utiliser le petit plugin .NET LayerFilterImportExport téléchargeable depuis cette page.
  13. Si tu veux déplacer la sélection suivant un vecteur (déplacement) donné par exemple pour déplacer la sélection de 10 unités sur Z (0, 0, 10), au lieu de donner un point de base puis @0,0,10, ou d'indiquer la direction avec curseur et d'entrer 10 (ce qui est parfois acrobatique) tu fais entrée puis 0,0,10.
  14. Euh... Je ne suis pas sûr d'avoir compris la demande, mais les commandes COPIER et DEPLACER ont une option par défaut : <Déplacement> qui revient à prendre l'origine (0, 0, 0) comme point de base. COPIER Sélectionner des objets: Spécifiez le coin opposé: 147 trouvé(s) Sélectionner des objets: [Entrée] Paramètres courants: Mode Copier = Multiple Spécifiez le point de base ou [Déplacement/mOde] <Déplacement>: [Entrée] Spécifiez le déplacement <0.0000, 0.0000, 0.0000>: 0,50
  15. Un LISP !? On est dans le forum AutoCAD LT 2020-2022.
  16. (gile)

    Ferraillage 3D

    Les mêmes qui se gargarisent du mot "algorithme" quand ils parlent de programme informatique.
  17. (gile)

    Donnez-moi un Z !

    Pour ceux que ça intéresse, avec .NET, c'est plus simple et plus explicite. C# static double? CoordZ(Point3d p1, Point3d p2, Point3d p3, Point3d p) { var plane = new Plane(p1, p2, p3); var line = new Line3d(p, Vector3d.ZAxis); return line.IntersectWith(plane)?[0].Z; } F# let coordZ (p1: Point3d) (p2: Point3d) (p3: Point3d) (p: Point3d) = match (new Line3d(p, Vector3d.ZAxis)).IntersectWith(new Plane (p1, p2, p3)) with | null -> None | pts -> Some pts.[0].Z
  18. (gile)

    Donnez-moi un Z !

    Une dernière tentative en VBA (pas testée). J'ai remplacé tous les Variants dans les déclarations par de Double(). Function Vector(pt1() As Double, pt2() As Double) As Double() Dim result(0 To 2) As Double result(0) = pt2(0) - pt1(0) result(1) = pt2(1) - pt1(1) result(2) = pt2(2) - pt1(2) Vector = result End Function Function DotProduct(v1() As Double, v2() As Double) As Double DotProduct = v1(0) * v2(0) + v1(1) * v2(1) + v1(2) * v2(2) End Function Function CrossProduct(v1() As Double, v2() As Double) As Double() Dim result(0 To 2) As Double result(0) = v1(1) * v2(2) - v1(2) * v2(1) result(1) = v1(2) * v2(0) - v1(0) * v2(2) result(2) = v1(0) * v2(1) - v1(1) * v2(0) CrossProduct = result End Function Function CoordZ(pt1() As Double, pt2() As Double, pt3() As Double, pt() As Double) As Double Dim norm(0 To 2) As Double = CrossProduct(vect(pt1, pt2), vect(pt1, pt3)) Dim zAxis(0 To 2) As Double zAxis(2) = 1.0 CoordZ = DotProduct(norm, Vector(pt, pt1) / DotProduct(norm, zAxis) End Function
  19. Salut, J'ai essayé de faire un petit topo sur les bases de l'utilisation du calcul vectoriel avec AutoLISP avec quelques exemples d'utilisation. J'ai tenté d'expliquer les différentes opérations avant de donner leur implémentation en LISP. C'est une nouvelle page dans la rubrique Tutoriels de gileCAD. Merci de me signaler si vous voyez des erreurs ou des coquilles (merci à @Patrick Emin, Autodesk pour en avoir dégoté plusieurs).
      • 2
      • Upvote
  20. Salut, Je ne suis pas certain d'avoir compris la demande, mais le LISP dans cette réponse semble ressembler à ce que tu cherches.
  21. (gile)

    Donnez-moi un Z !

    Cette phrase ne veut absolument rien dire. S'il te plait, fait un effort quand tu postes un message essaye qu'il soit compréhensible et prend le temps de te relire pour t'en assurer.
  22. (gile)

    Donnez-moi un Z !

    J'ai ajouté une page à la rubrique Tutoriels de gileCAD avec un petit topo sur le calcul vectoriel (en LISP). J'ai essayé de refaire un peu ce que j'avais fait sur AcadLabs l'ancien site de @didier. Le code VBA que, manifestement, je ne suis pas arrivé à écrire est une extrapolation pour cette demande particulière de la routine gc:IntersLinePlane à la fin de cette page.
  23. (gile)

    Donnez-moi un Z !

    @Curlygoth Manifestement, tu ne sais pas ce que sont produit scalaire et produit vectoriel et tu ne comprends pas complètement les codes qu'on te donne. Le produit scalaire de deux vecteurs (dot product en anglais) est un nombre réel (appelé scalaire). Le produit vectoriel de deux vecteurs (cross product en anglais) est un vecteur, donc un simple tableau unidimensionnel en VBA, il n'est pas question de "tableau dans un tableau". Le corps de la fonction CrossProduct que j'ai donné est exactement le même que celui de celle que tu as improprement appelée PROD_SCALAIRE. La seule différence est dans la déclaration des arguments et du type de retour et là on touche à un autre truc qui me sort par les yeux en VBA : le typage plus ou moins dynamique et les déclarations optionnelles. Donc je te laisse te dépatouiller avec ça, c'est toi qui connais le VBA. Sinon les résultats que j'ai avec la méthode utilisant le produit scalaire donne les bon résultats (du moins en LISP). Cette méthode est équivalente à celle donnée par @didier elle met juste l'utilisation du produit scalaire sous une forme explicite.
  24. (gile)

    Donnez-moi un Z !

    Avec PROD_SCALAIRE ce n'est pas seulement "ne pas être bon" c'est carrément "être faux" en donnant comme à une opération celui d'un autre. Je vais essayer de prendre le temps pour une petite explication des base du calcul vectoriel. Ça c'est ton domaine, c'est du VBA, je n'ai jamais vraiment compris ces histoires de variants (je n'ai jamais vraiment cherché non plus), mais tu peux essayer : Dim norm_1 As Variant = CrossProduct(Vector(pt1, pt2), Vector(pt1, pt2)) Dim norm_1 As Variant = CrossProduct(Vector(pt1, pt2), Vector(pt1, pt2))
  25. (gile)

    Donnez-moi un Z !

    @Curlygothla fonction que tu appelles PROD_SCALAIRE dans la "méthode didier" calcule en fait le produit vectoriel. À définir des fonctions réutilisables, autant les nommer correctement... EDIT : et le nom de la fonction Z_VECTEUR_NORMAL_Pa n'est pas très explicite.
×
×
  • 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é