Aller au contenu

Pente le long d\'un axe


Messages recommandés

Posté(e)

Bonjour a tous

Il y a eu un bug au premier message

Je viens vers vous car je voudrais savoir s'il est possible en lisp de sélectionner des blocs qui se trouvent a une certaine distance d'un axe en plan 2D de manière a calculer des pentes entre ces blocs points topo et l'axe 3D.

Je précise que sous l'axe en plan 2D se trouve une polyligne 3D avec des z variables.

Il faudrait je pense Projeter les blocs sur l'axe puis calculer et écrire les pentes entre les blocs origines et les blocs projetés

J'espère ne pas trop embrouiller l'esprit par contre je précise que je n'ai pas de MNT dans mon fichier.

Merci par avance de votre aide

Posté(e)

Bonjour Lilli

Non je n'ai pas Covadis mais attention de ne pas confondre, je ne veux pas de ma polyligne 3D entre les sommets de mon axe en plan mais les pentes entre les blocs projetés sur la polyligne 3D et les blocs origines

De plus les pentes calculees devront s'écrire dans Autocad

Est ce possible avec Autocad ?

J'ai déjà trouve un lisp de gile apparement qui projette les blocs sur un axe mais pour les pentes ?

Je ne sais pas programmer d'où ma question.

Merci D' avance pour vos réponses

 

Posté(e)

coucou

 

je veux bien comprendre avant de répondre par un lisp

 

tu as

des points (ou des blocs avec attributs) insérés avec une altitude

ensuite tu as une polyligne 3D (qui est en fait ta ligne rouge)

 

tu veux

connaître la pente entre un de ces points et un sommet de la polyligne 3D ?

ou bien

connaître la pente entre la projection d'un de ces points sur la polyligne 3D ?

 

amicalement

 

Posté(e)

Merci de vos réponses

Mes points topo sont des blocs avec attribut

Le z du bloc ou l'altitude du point est la première étiquette de mes attributs intitule ALTITUDE

Et mon bloc point se nomme POINTS

Je veux projeter ces blocs sur mon axe 3D et déterminer les pentes des blocs projetés par rapport aux blocs D'origine et non par rapport aux sommets de la polyligne 3D

L'altitude des blocs projetés doit donc changer par rapport blocs d'origines et être interpoles sur mon axe 3D

Peux t-on le faire en lisp ?

Merci encore de votre aide

 

Posté(e)

coucou

 

je pense que ça va être une de mes dernières questions :(

 

tes points sont insérés en Z connu ?

ou bien ils sont insérés en Z 0 et il faut lire la valeur de l'attribut ?

 

ensuite je ne comprends pas :

 

projetés par rapport aux blocs D'origine

et

non par rapport aux sommets de la polyligne 3D

 

projetés comment ?

vont-ils se déplacer en XY ?

 

amicalement

Posté(e)

Oui Didier les blocs ont un z connu et ne sont pas a z 0

Les blocs origines ne doivent pas bouger en X Y

Il faudrait interpoler une copie de ces blocs perpendiculairement sur l'axe 3d

Merci encore de ton attention

Posté(e)

Bonjour

 

Peut-être qu'avec ce lisp en l'adaptant un peu, VtKp devrait trouver son bonheur

 

 

 

(defun c:pn1 (/ blk pl elv dist ss ins p1 p2 new i dist1)
(vl-load-com)
(or *acdoc*
(setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
)
(if
(and
(setq blk (car (entsel "\nSélectionnez un des blocs à traiter: ")))
(setq blk (vlax-ename->vla-object blk))
(= (vla-get-ObjectName blk) "AcDbBlockReference")
(setq pl (car (entsel "\nSélectionnez la polyligne: ")))
(setq pl (vlax-ename->vla-object pl))
(= (vla-get-ObjectName pl) "AcDbPolyline")
(setq elv (vla-get-Elevation pl))
(setq dist (getdist "\nSpécifiez la longueur minimale : "))
(ssget "_X"
(list '(0 . "INSERT") (cons 2 (vla-get-Name blk)))
)
)
(progn
(vla-add (vla-get-Layers *acdoc*) "BLOCS_PROJETES")
(setq i 1)
(vlax-for b (setq ss (vla-get-ActiveSelectionSet *acdoc*))
(setq ins (vlax-get b 'InsertionPoint))
(if
(<= (distance (setq p1 (list (car ins) (cadr ins) elv))
(setq p2 (vlax-curve-getClosestPointTo pl p1))
)
dist
)
(progn
(setq new (vla-Copy b))
(vla-Move
new
(vlax-3d-point ins)
(vlax-3d-point (list (car p2) (cadr p2) (caddr ins)))
)
(setq dist1 (distance p1 p2))
(vla-put-Layer new "BLOCS_PROJETES")
)
)
(setq i (1+ i))
)
(vla-delete ss)
)
)
(princ)
) 

Posté(e)

Bonjour a tous

Merci chris_mtp pour ce lisp qui certes n'est pas tout a fait ce que je souhaite mais reste un bon début

Il ne me reste qu'à essaye de programmer un truc pour interpoler en z un point connu en xy qui serait sur mon axe polyligne 3D

Si quelqu'un pourrait m'aider pour commencer ?

Merci encore de votre aide

 

Posté(e)

C'est dommage de ne pas avoir de suite à ce sujet très interressant qui pourrait être bien utile

Pour ma part, projeter un point sur une polyligne 3D en l'interpolant, c'est à dire récupérer le Z de la polyligne 3D et non du point projeté, je ne vois vraiment pas comment faire

 

Peut être que Gile aurait une solution si tu nous entends......

 

John

Posté(e)

Bonjour a tous,

Je ne m'en sors toujours pas pour faire ce lisp qui projette en 3d les blocs sur mon axe.

Quelqu'un aurait-il une idée ?

Merci d'avance

Posté(e)

Salut,

 

j'ai fais ça, ça définit l'altitude des points au centimètre près (au millimètre ça prend trop de temps parce que c'est codé avec les pieds :D )

 

; Retourne les sommets d'une polyline3D sous forme de liste ((x y z) (x y z))
(defun listSomP3d (pl / lst nb pts ptsl)
  (setq lst (vlax-safearray->list (vlax-variant-value (vla-get-coordinates pl))))
  (setq nb 0)
  (while (<= nb (length lst))
    (if (< (length pts) 3)
      (progn
        (setq pts (append pts (list (nth nb lst))))
        (setq nb (+ nb 1))
      )
      (progn
        (setq ptsl (append ptsl (list pts)))
        (setq pts nil)
      )
    )
  )
  (print ptsl)
)


(defun c:proj ()
  (setvar "cmdecho" 0)
  (command "annuler" "m")
  (setq acc (getvar "osmode"))
  (command "accrobj" "aucun")
  
  (print "Selectionner les blocs a projeter")
  (setq ss (ssget))
  (setq pl (car (entsel "Pointez la polyligne 3D")))
  (setq pl (vlax-ename->vla-object pl))
  (if (/= (vla-get-objectname pl) "AcDb3dPolyline") (exit 1))
  (setq coords (listSomP3d pl))
  ; Trouve l'altitude min et max de la poly3d
  (setq zmin (nth 2 (nth 0 (vl-sort coords (function (lambda (e1 e2) (< (nth 2 e1) (nth 2 e2))))))))
  (setq zmax (nth 2 (nth 0 (vl-sort coords (function (lambda (e1 e2) (> (nth 2 e1) (nth 2 e2))))))))
  
  (setq count 0)
  (while (< count (sslength ss))
     (setq blk (ssname ss count))
     (setq ptins (cdr (assoc 10 (entget blk))))
     
     ; Calcul la distance la plus courte jusqu'a la polyligne en fonction de l'altitude du point entre zmin et zmax
     (setq nb zmin lst nil)
     (while (< nb zmax)
       (setq pt (list (car ptins) (cadr ptins) nb))
       (setq ptint (vlax-curve-getClosestPointTo pl pt))
       (setq dis (distance pt ptint))
       (setq lst (append lst (list (list dis nb))))
       ; On teste tous les cm
       (setq nb (+ nb 0.01))
     )
     (setq zproj (nth 1 (nth 0 (vl-sort lst (function (lambda (e1 e2) (< (car e1) (car e2))))))))
     
     ; Creation du nouveau bloc
     (command "_copy" blk "" ptins (list (car ptins) (cadr ptins) zproj))
     (entmod (subst (cons 8 "points-proj") (assoc 8 (entget (entlast))) (entget (entlast))))
     ; Modification de l'atribut altitude
     (setq blkproj (vlax-ename->vla-object (entlast)))
     (setq attr (vlax-invoke blkproj 'getattributes))
     (foreach a attr
        (setq AttName (vla-get-TagString a))
        (if (= AttName "ALT") (vla-put-TextString a (rtos zproj 2 2)))
      )
    (setq count (+ count 1))
  )
  
  (setvar "osmode" acc)
)

Aide au téléchargement du cadastre dgfip-download-helper
Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0
Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js

Posté(e)

Bonjour à tous,

 

Merci pour vos réponses.

Merci vincentp010 pour ton lisp mais lorsque je l'utilise, les blocs origines ne bougent pas,

j'ai essayé avec une version ci-dessous que je me suis permis de modifer

 

; Retourne les sommets d'une polyline3D sous forme de liste ((x y z) (x y z))
(defun listSomP3d (pl / lst nb pts ptsl)
(setq lst (vlax-safearray->list (vlax-variant-value (vla-get-coordinates pl))))
(setq nb 0)
(while (<= nb (length lst))
(if (< (length pts) 3)
(progn
(setq pts (append pts (list (nth nb lst))))
(setq nb (+ nb 1))
)
(progn
(setq ptsl (append ptsl (list pts)))
(setq pts nil)
)
)
)
(print ptsl)
)

(defun c:proj (/ acc ss pl coords zmin zmax count blk ptins nb lst pt ptint dis zproj blkproj attr AttName)

(setvar "CMDECHO" 0)
(command "annuler" "m")
(setq acc (getvar "OSMODE"))
(setvar "OSMODE" 0)
(prompt "\nProjection de Blocs sur Polyligne 3D")
(prompt "\nSelectionner les blocs a projeter")
(setq ss (ssget))
(setq pl (car (entsel "\nPointez la polyligne 3D")))
(setq pl (vlax-ename->vla-object pl))
(if (/= (vla-get-objectname pl) "AcDb3dPolyline") (exit 1))
(setq coords (listSomP3d pl))

; Trouve l'altitude min et max de la poly3d
(setq zmin (nth 2 (nth 0 (vl-sort coords (function (lambda (e1 e2) (< (nth 2 e1) (nth 2 e2))))))))
(setq zmax (nth 2 (nth 0 (vl-sort coords (function (lambda (e1 e2) (> (nth 2 e1) (nth 2 e2))))))))
(setq count 0)
(while (< count (sslength ss))
(setq blk (ssname ss count))
(setq ptins (cdr (assoc 10 (entget blk))))

; Calcul la distance la plus courte jusqu'a la polyligne en fonction de l'altitude du point entre zmin et zmax
(setq nb zmin lst nil)
(while (< nb zmax)
(setq pt (list (car ptins) (cadr ptins) nb))
(setq ptint (vlax-curve-getClosestPointTo pl pt))
(setq dis (distance pt ptint))
(setq lst (append lst (list (list dis nb))))

; On teste tous les cm
(setq nb (+ nb 0.005))
)
(setq zproj (nth 1 (nth 0 (vl-sort lst (function (lambda (e1 e2) (< (car e1) (car e2))))))))

; Creation du nouveau bloc
(command "_copy" blk "" ptins (list (car ptint) (cadr ptint) zproj))
(entmod (subst (cons 8 "BLOC_PROJETES") (assoc 8 (entget (entlast))) (entget (entlast))))
; Modification de l'atribut altitude
(setq blkproj (vlax-ename->vla-object (entlast)))
(setq attr (vlax-invoke blkproj 'getattributes))
(foreach a attr
(setq AttName (vla-get-TagString a))
(if (= AttName "ALTITUDE") (vla-put-TextString a (rtos zproj 2 2)))
)
(setq count (+ count 1))
)
(setvar "OSMODE" acc)
(prin1)
) 

 

Il faudrait si possible sélectionner les blocs qui se trouvent à une certaine distance de l'axe 3D et non pas les sélectionner les uns après les autres, d'autre part, les blocs doivent si possible être projetés perpendiculairement à l'axe 3D avec une altitude au mm près.

Bien sur si c'est possible.

 

Je vous joins comme le conseille bryce un exemple de mon fichier plus parlant.

http://www.cijoint.fr/cjlink.php?file=cj201102/cijGo2KGTY.jpg

 

j'essaie de trouver un hébergeur gratuit de mon dwg sur lequel vous pourrait le télécharger mais en vain, je continue et je reviens vers vous

 

Merci encore de votre aide.

 

 

Posté(e)

Bonsoir,

 

Voici un lisp qui a l'air de fonctionner comme tu le souhaites pour la partie projection des blocs.

Je n'ai pas encore intégré le calcul et l'affichage de la pente.

Dis-moi déjà si ça correspond à ton besoin. :)

 

Edit: lien et code supprimés, nouvelle version un peu plus bas.

 

 

 

[Edité le 27/2/2011 par bryce]

Posté(e)

Bonjour

Merci Bryce c'est exactement ce qu'il me faut

Les blocs se projettent parfaitement dans un nouveau calque nickel et les interpolations se font nickel aussi

Vraiment merci

Il ne manque plus que le calcul de pEnte et l'insertion des textes dans un nouveau calque si possible

Merci encore de ton aide

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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é