Aller au contenu

Interpolation d'une altitude


Messages recommandés

Posté(e)

Bonjour,

 

Pour ceux qui ne possède pas Covadis, je vous propose ce qui suit:

 

Que fait ce programme?

 

Il va vous demander de sélectionner un modèle de point (en 3D de préférence, autrement c'est pas bien la peine) pour créer un filtre automatiquement depuis ses caractéristiques (plan, couleur, espace etc...)

Il vous sera alors demander si vous voulez agir sur tous les points ou seulement ceux qui sont dans la zone d'affichage. L'option affichage est proposée par défaut car il sera plus rapide de n'agir que dans la zone d'écran pour effectuer que quelques interpolations.

Ensuite il vous sera demandé un point que vous désirez interpoler.

Le programme va alors rechercher les 3 points les plus proches ET qui sont susceptible de contenir le point demandé à l'intérieur du triangle formé par ces 3 points. (ce triangle virtuel est d'ailleurs dessiné, mais disparaît à la fin ou lors d'un pan, zoom).

Le z est affiché dans la barre de commande et le point 3D interpolé dessiné dans le calque courant.

Le programme tourne en boucle tant que vous fournissez des point à définir.

 

Etant écrit depuis peu, il peu y avoir des bugs...

 

Les fonctions vectorielles utilisée sont de (gile)

Le code

 

;vect - v^v - pscal par Gilles Chanteau 
;******************
(defun vect (p1 p2)
 (mapcar '- p2 p1)
)
(defun v^v (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)))
 )
)
(defun pscal (v1 v2)
 (apply '+ (mapcar '* v1 v2))
)
;******************
(defun pt_include (p1 p2 p3 px /)
 (cond
   (
     (and
       (>= (pscal (v^v (vect p1 p2) (vect p1 px)) (v^v (vect p1 px) (vect p1 p3))) 0)
       (>= (pscal (v^v (vect p2 p1) (vect p2 px)) (v^v (vect p2 px) (vect p2 p3))) 0)
       (>= (pscal (v^v (vect p3 p1) (vect p3 px)) (v^v (vect p3 px) (vect p3 p2))) 0)
     )
     T
   )
   (T nil)
 )
)
(defun c:Z_between3pt ( / ptc pix_size k js dxf_cod lremov mod_sel ptx lst_tmp nw_lst n pt nw_js nb ent lst_pt X1 X2 X3 Y1 Y2 Y3 Z1 Z2 Z3 E1 E2 E3 E4 Z)
 (cond
   ((equal (getvar "VIEWDIR") '(0.0 0.0 1.0) 1E-13)
     (setq
       ptc (getvar "VIEWCTR")
       pix_size (getvar "SCREENSIZE")
       k (/ (getvar "VIEWSIZE") (cadr pix_size))
       pix_size (list (* (car pix_size) k 0.5) (* (getvar "VIEWSIZE") 0.5) 0.0)
     )
     (princ "\nChoix d'un point modèle pour constituer le filtrage: ")
     (while
       (null
         (setq js
           (ssget "_+.:E:S"
             (list
               '(0 . "POINT")
               (cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
               (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
             )
           )
         )
       )
       (princ "\nCe n'est pas un objet valable pour le filtrage, requiert un point!")
     )
     (setq dxf_cod (entget (ssname js 0)))
     (foreach m (foreach n dxf_cod (if (not (member (car n) '(0 67 410 8 6 62 48 39 210 50))) (setq lremov (cons (car n) lremov)) lremov))
       (setq dxf_cod (vl-remove (assoc m dxf_cod) dxf_cod))
     )
     (initget "Tout Affichage _All Display")
     (if (eq (setq mod_sel (getkword "\nMode de sélection filtrée, choix [Tout/Affichage]<Affichage>: ")) "All")
       (setq js (ssget "_X" dxf_cod))
       (setq js (ssget "_C" (trans (mapcar '- (trans ptc 1 0) pix_size) 0 1) (trans (mapcar '+ (trans ptc 1 0) pix_size) 0 1) dxf_cod))
     )
     (cond
       (js
         (initget 9)
         (while (setq ptx (getpoint "\nDonner un point pour identifier le Z: "))
           (setq ptx (trans ptx 1 0) lst_tmp nil nw_lst nil lst_pt nil)
           (repeat (setq n (sslength js))
             (setq
               pt (cdr (assoc 10 (entget (ssname js (setq n (1- n))))))
               lst_tmp (cons (cons (distance (list (car pt) (cadr pt)) (list (car ptx) (cadr ptx))) n) lst_tmp)
             )
           )
           (while (and (not (zerop (length lst_tmp))) (< (length nw_lst) 3))
             (setq
               nw_lst (cons (assoc (apply 'min (mapcar 'car lst_tmp)) lst_tmp) nw_lst)
               lst_tmp (vl-remove (assoc (apply 'min (mapcar 'car lst_tmp)) lst_tmp) lst_tmp)
             )
             (if (eq (length nw_lst) 3)
               (if
                 (not
                   (pt_include
                     (list (cadr (assoc 10 (entget (ssname js (cdar nw_lst))))) (caddr (assoc 10 (entget (ssname js (cdar nw_lst))))) 0.0)
                     (list (cadr (assoc 10 (entget (ssname js (cdadr nw_lst))))) (caddr (assoc 10 (entget (ssname js (cdadr nw_lst))))) 0.0)
                     (list (cadr (assoc 10 (entget (ssname js (cdaddr nw_lst))))) (caddr (assoc 10 (entget (ssname js (cdaddr nw_lst))))) 0.0)
                     (list (car ptx) (cadr ptx) 0.0)
                   )
                 )
                 (setq nw_lst (cdr nw_lst))
               )
             )
           )
           (cond
             ((and nw_lst (eq (length nw_lst) 3))
               (setq
                 nw_js (ssadd)
                 nw_js (ssadd (ssname js (cdar nw_lst)) nw_js)
                 nw_js (ssadd (ssname js (cdadr nw_lst)) nw_js)
                 nw_js (ssadd (ssname js (cdaddr nw_lst)) nw_js)
                 nb 0
               )
               (repeat (setq n (sslength nw_js))
                 (setq
                   ent (ssname nw_js (setq n (1- n)))
                   pt (cdr (assoc 10 (entget ent)))
                   lst_pt (cons pt lst_pt)
                 )
               )
               (grvecs
                 (list
                   3 (trans (car lst_pt) 0 1) (trans (cadr lst_pt) 0 1)
                   3 (trans (cadr lst_pt) 0 1) (trans (caddr lst_pt) 0 1)
                   3 (trans (caddr lst_pt) 0 1) (trans (car lst_pt) 0 1)
                 )
               )
               (foreach item '(("X" . "'car") ("Y" . "'cadr") ("Z" . "'caddr"))
                 (mapcar '(lambda (x) (set (read (strcat (car item) (itoa (setq nb (1+ nb))))) x))
                   (mapcar (eval (read (cdr item))) lst_pt)
                 )
                 (setq nb 0)
               )
               (setq
                 E1 (+ (* X1 (- Y2 Y3)) (* X2 (- Y3 Y1)) (* X3 (- Y1 Y2)))
                 E2 (+ (* Y1 (- Z2 Z3)) (* Y2 (- Z3 Z1)) (* Y3 (- Z1 Z2)))
                 E3 (+ (* Z1 (- X2 X3)) (* Z2 (- X3 X1)) (* Z3 (- X1 X2)))
                 E4 (- (- (* E2 X1)) (* E3 Y1) (* E1 Z1))
                 Z (- (- (* (/ E2 E1) (car ptx))) (* (/ E3 E1) (cadr ptx)) (/ E4 E1))
               )
               (entmake (list '(0 . "POINT") (assoc 67 (entget ent)) (assoc 410 (entget ent)) (cons 8 (getvar "CLAYER")) (cons 10 (list (car ptx) (cadr ptx) Z)) (assoc 210 (entget ent))))
               (print Z)
             )
             (T (princ "\nPas assez de points trouvés pour que le point cherché soit inclu dans le triangle!"))
           )
           (initget 8)
         )
         (redraw)
       )
     )
   )
   (T (princ "\nVous n'êtes pas en vue orthogonale! rectifiez et relancer la commande"))
 )
 (prin1)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Bonjour à toutes et tous,

 

Super ce prog. bonuscad !!:)

 

Je n'ai eu que 2 mn pour tester, mais voilà chez moi au premier lancement =>

 

Commande:

Z_BETWEEN3PT

Choix d'un point modèle pour constituer le filtrage:

Choix des objets:

Ce n'est pas un objet valable pour le filtrage, requiert un point!

Choix des objets: *Annuler*

Impossible d'appeler (command) à partir de *error* sans appeler préalablement (*push-error-using-command*).

Il est recommandé de convertir les appels (command) en (command-s).

Commande:

 

 

Il semble que je ne puisse pas sélectionner de bloc point (comme celui de covadis par exemple).

 

Il faut absolument 1 point ?

 

Et j'ai encore ce message =>

 

Il est recommandé de convertir les appels (command) en (command-s).

Commande:

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Coucou

 

Lili2006; c'est écrit ici :(il ne faut pas croire qu'on écrit des codes en fonction de Covadis, sans demande explicite et ce n'est pas le cas de ce lisp qui utilise les vecteurs comme le fait si intelligemment (Gile))

 

11-01-2015 17-02-45.jpg

 

BonusCad : je dirais que c'est pour interpoler un point sur un plan défini par trois points, (Gile) répondra sans doute

 

amicalement

Posté(e)

Re,

 

Salut Didier,

 

(il ne faut pas croire qu'on écrit des codes en fonction de Covadis)

 

C'était un exemple,...Car j'ai créé un bloc point avec des données attributs/champs qui me donne la position spatiale d'un point.

 

 

 

La routine semble bien fonctionner !

 

J'ai fait un test de correspondance avec Covadis, (En bleu Zinterpolé Bonuscad, en vert Zinterpolé Covadis) =>

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Coucou

 

je me suis sans doute mal exprimé n'étant pas au dessus de ton épaule au moment de la sélection

il ne faut pas sélectionner le bloc en pensant que le programme va en extraire le point d'insertion,comme des les commandes Covadis

ni même une extrémité ou autre accrochage, il faut bel et bien un point (AutoCAD) (mais c'est facile de compléter le filtre).

 

Amicalement

 

ps:avec une telle police dans le style de point il ne faudra pas te plaindre de ralentissement de REGEN si présence de milliers de points topo.

Posté(e)

Bonjour à toutes et tous,

 

Salut Didier,

 

il faut bel et bien un point (AutoCAD)

 

J'avais bien compris, d’où ma question,...:)

 

(mais c'est facile de compléter le filtre).

 

Voilà, en rajoutant les blocs, c'était un peu l'objet de ma demande,...

 

avec une telle police dans le style de point

 

C'était juste pour un test ponctuel sur quelques points,...Je suis également attentif à la police que j'utilise dans mes dessins,...

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Bonjour,

 

il ne faut pas croire qu'on écrit des codes en fonction de Covadis

 

Tout à fait, le but ici n'est pas de refaire un COVADIS, mais simplement d'avoir un outil pour palier au manque pour un besoin simple de fonctions pour faire quelque chose de similaire sans acquérir l'artillerie lourde (apprentissage et coût) d'un applicatif comme COVADIS.

 

Je ne recherche pas la compatibilité avec celui-ci, ni faire un substitut (ça serait prétencieux de ma part), simplement des petites fonctions qui permettent de faire certaines choses sans avoir à acquérir un logiciel couteux. COVADIS sera toujours inspensable pour celui qui veut faire un projet "sérieux". Le carroyage, les talus, la clothoïde pour ne citer que les principaux n'ont été créer que dans ce but: avoir un paliatif qui permet d'avoir un rendu facilement sur un petit projet à la marge.

 

Impossible d'appeler (command) à partir de *error* sans appeler préalablement (*push-error-using-command*).

Il est recommandé de convertir les appels (command) en (command-s).

 

Il faudrait voir si d'autre personne ont ce problème car comme pour talus aucun appel à (command) dans le lisp. J'ai l'impression que ce problème est propre seulement à ton installation.

 

Il faut absolument 1 point ?

Oui, mais je pourrais étendre la fonction au bloc avec attribut.

D'ailleurs la fonction écrite ici est issue d'une demande sur un forum anglais, où là, la récupération se faisait sur un bloc avec attribut

Dicussion originale d'où est extrait le code.

 

J'ai fait un test de correspondance avec Covadis, (En bleu Zinterpolé Bonuscad, en vert Zinterpolé Covadis) =>

Ton test montre la différence entre Covadis et mon petit applicatif.

Covadis s'appuit (je suppose) sur le calcul d'un MNT où les rupture de pentes ont étés définies pour faire son interpolation, donc la tringulation faite ne sera pas forcément identique à celle faite par mon algorithme de ma routine qui est beaucoup plus simpliste.

En effet pour un point X il existe 2 solutions pour qu'il appartienne à un triangle (ils ont un coté commun), ma routine choisi par défaut celui qui a les sommets les moins éloignés (mais ce n'est pas forcément le plus judicieux en cas de rupture de pente). Donc ce fait peut expliquer des différences (la plus part du temps minimes) dans les résultats trouvés.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Re,

 

Salut bonuscad,

 

mais simplement d'avoir un outil pour palier au manque pour un besoin simple de fonctions

 

Mes étudiants n'ont plus non pas Covadis à la maison (seulement au lycée durant les heures ou la salle info est dispo,...!!). Bref, c'est pourquoi je suis également très intéressé par tes outils,..:)

 

J'ai l'impression que ce problème est propre seulement à ton installation.

 

Ceci dis, j'ai pu tester sans pb ton prog. !!:huh:

 

Covadis s'appuit (je suppose) sur le calcul d'un MNT où les rupture de pentes ont étés définies pour faire son interpolation,

 

 

Pour comparer ce qui est comparable, j'ai utilisé la fonction Covadis d'interpolation sur 3 points en utilisant les 3 mêmes points que ta routine. (J'ai donc interpolé dans les mêmes triangles). Le point ou il y a un écart de 1 cm n'a pas été traité avec le même triangle (désolé, j'ai oublié de le préciser dans le post précédent) et la valeur donnée est cohérente avec le choix de la triangulation (vérification manuelle sur deux cotés du traingle). C'est ce qui m'amène à penser que ta routine est juste en terme de calcul aussi !

 

(mais ce n'est pas forcément le plus judicieux en cas de rupture de pente).

 

Je vois de quoi tu parles,

(la plus part du temps minimes)

 

Je pense aussi,...

 

Oui, mais je pourrais étendre la fonction au bloc avec attribut.

 

Si tu en a l'envie et que d'autres personnes sont intéressées ici, alors ce sera Tip Top pour mes étudiants (Souvent, ils préparent à la maison leur esquisse 3D pour finaliser les travaux VRD sur les modules Covadis qui vont bien quand ils sont au lycée,...)

 

Merci encore,

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

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é