Author Topic: Triangulation (re-visited)  (Read 317685 times)

0 Members and 2 Guests are viewing this topic.

ymg

  • Guest
Re: Triangulation (re-visited)
« Reply #375 on: April 29, 2015, 03:59:52 PM »
Here a small video for the c:prof command

ymg

pedroantonio

  • Guest
Re: Triangulation (re-visited)
« Reply #376 on: April 29, 2015, 04:49:22 PM »
Hi  ymg !!This is the last version ? Did you add oasis in this version ?

Thanks !!

ymg

  • Guest
Re: Triangulation (re-visited)
« Reply #377 on: April 29, 2015, 05:18:10 PM »
topographer,

Sorry, but not there yet!

ymg

ymg

  • Guest
Re: Triangulation (re-visited)
« Reply #378 on: April 29, 2015, 06:20:31 PM »
Marko,

The idea of lofting is so we can overlap 2 surfaces
say one is existing ground, the other one projected.

If we loft both surfaces down to elevation 0,
we can calculate the cut and fill required.

The final volume is simply Volume of surface existing
minus the volume of the Projected.

I am oversimplifying here, as we must keep only
the overlapping part of both surfaces.

I did a bit of work on it, and could get the Volume.

Finding what is Cut and what is Fill however is trickier.

It's been a long time but I believe the below code was my latest.
Don't remember the status of it, so it needs to be checked.

Code - Auto/Visual Lisp: [Select]
  1. (defun c:voltin (/ );*acaddoc* bmax bmin en en3 en4 en5 en6 h i layp layr
  2.                     ;pins pmax pol rmax ss1 ss2 ssprop ssref v1 v2 v3 varl
  3.                     ;volp volr vp vr y)
  4.                  
  5.  
  6.    ;;; Error Handler by ElpanovEvgenyi                                        ;
  7.    (defun *error* (msg)
  8.         (mapcar 'eval varl)
  9.         (if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*EXIT*")))
  10.            (princ (strcat "\nError: " msg))
  11.         )
  12.         (and *AcadDoc* (vla-endundomark *AcadDoc*))
  13.         (princ)
  14.    )
  15.      
  16.    (setq varl '("CLAYER" "OSMODE" "CMDECHO" "DIMZIN")
  17.          varl (mapcar (function (lambda (a) (list 'setvar a (getvar a)))) varl)
  18.    )    
  19.      
  20.    (or *AcadDoc* (setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object))))
  21.            
  22.      
  23.    (setvar 'CMDECHO 0)
  24.    (setvar 'DIMZIN 0)
  25.    (setvar 'OSMODE 0)
  26.  
  27.    (if (and (setq layr (cdr (assoc 8 (entget (car (entsel "\nPick a 3DFACE on Reference Layer: ")))))
  28.                   ss1 (ssget "_X" (list '(0 . "3DFACE")(cons 8 layr)))
  29.             )
  30.             (setq layp (cdr (assoc 8 (entget (car (entsel "\nPick a 3DFACE on Proposed Layer: ")))))
  31.                   ss2 (ssget "_X" (list '(0 . "3DFACE")(cons 8 layp)))
  32.             )
  33.        )    
  34.       (progn
  35.          (vla-startundomark *AcadDoc*)
  36.  
  37.          
  38.          (setvar 'CLAYER layr)
  39.          (setq ssref (ssadd))
  40.          (repeat (setq i (sslength ss1))
  41.               (setq   en (ssname ss1 (setq i (1- i)))
  42.                    ssref (ssadd (3df2sol en) ssref)
  43.               )
  44.           )
  45.           (vl-cmdf "_UNION" ssref "")
  46.           (setq en3 (entlast))
  47.           (vl-cmdf "_COPY" en3 "" '(0 0) '(0 0))
  48.           (setq enr (entlast))
  49.          
  50.           ;(vla-GetBoundingBox (vlax-eName->vla-Object en3) 'rmin 'rmax)
  51.           ;(setq rmax (vlax-SafeArray->List rmax))
  52.          
  53.          
  54.           (setvar 'CLAYER layp)
  55.           (setq ssprop (ssadd))
  56.           (repeat (setq i (sslength ss2))
  57.               (setq en (ssname ss2 (setq i (1- i)))
  58.                    ssprop (ssadd (3df2sol en) ssprop)
  59.               )
  60.           )
  61.           (vl-cmdf "_UNION" ssprop "")
  62.           (setq en4 (entlast))
  63.           (vl-cmdf "_COPY" en4 "" '(0 0) '(0 0))
  64.           (setq enp (entlast))
  65.          
  66.           ;(vla-GetBoundingBox (vlax-eName->vla-Object en4) 'pmin 'pmax)
  67.           ;(setq pmax (vlax-SafeArray->List pmax))
  68.          
  69.           (vl-cmdf "_-LAYER" "_M" "SUPERFICIES" "")
  70.  
  71.           (vl-cmdf "_-INTERFERE" en3 "" en4 "" "_Y")
  72.           (setq en5 (entlast))
  73.           (vl-cmdf "_COPY" en5 "" '(0 0) '(0 0))
  74.           (setq en6 (entlast))
  75.           (vl-cmdf "_COPY" en5 "" '(0 0) '(0 0))
  76.           (setq enc (entlast))
  77.           (setq vcom  (vlax-get-property (vlax-ename->vla-object en6)  'Volume))
  78.           (vla-GetBoundingBox (vlax-eName->vla-Object en4) 'bmin 'bmax)
  79.           (setq bmax (vlax-SafeArray->List bmax)
  80.                 bmin (vlax-SafeArray->List bmin)
  81.           )
  82.          
  83.           (vl-cmdf "_SUBTRACT" en3 "" en5 "")
  84.           (vl-cmdf "_SUBTRACT" en4 "" en6 "")
  85.          
  86.           (setq vref  (vlax-get-property (vlax-ename->vla-object enr)  'Volume)
  87.                 vprop (vlax-get-property (vlax-ename->vla-object enp)  'Volume)
  88.                 vcut  (vlax-get-property (vlax-ename->vla-object en3)  'Volume)
  89.                 vfill (vlax-get-property (vlax-ename->vla-object en4)  'Volume)
  90.           )
  91.          
  92.           (setvar 'CLAYER layr)
  93.           (setq y (cadr bmin)
  94.                 h (* (getvar 'TEXTSIZE) 1.5)
  95.           )      
  96.           (vl-cmdf "_text" "_J" "_MC" (list (car pins) y)           0 (strcat "Reference Volume: " (rtos vref 2 1) " m3"))
  97.           (setq v1 (entlast))
  98.           (setvar 'CLAYER layp)
  99.           (vl-cmdf "_text" "_J" "_MC" (list (car pins) (- y h))     0 (strcat " Proposed Volume: " (rtos vprop 2 1) " m3"))
  100.           (setq v2 (entlast))
  101.           (vl-cmdf "_text" "_J" "_MC" (list (car pins) (- y h h))   0 (strcat "      Cut Volume: " (rtos vcut 2 1) " m3"))
  102.           (setq v3 (entlast))
  103.           (vl-cmdf "_text" "_J" "_MC" (list (car pins) (- y h h h)) 0 (strcat "     Fill Volume: " (rtos vfill 2 1) " m3"))
  104.           (setq v4 (entlast))
  105.          
  106.           (vl-cmdf "_MOVE" en3 en4 v1 v2 v3 v4 "" pins pause)
  107.           (vl-cmdf "_VSCURRENT" "_S" "")
  108.       )      
  109.    )  
  110.    (*error* nil)
  111. )
  112.  
  113. ;; 3df2sol                                                                    ;
  114. ;; Given a 3DFACE Loft it Down to Elevation 0                                 ;
  115. ;; Returns the ename of the Solid created.                                    ;
  116.  
  117. (defun 3df2sol (en / en1 en2 p1 p2 p3 p4)
  118.    (setq  ent (entget en)
  119.            p1 (cdr (assoc 10 ent))
  120.            p2 (cdr (assoc 11 ent))
  121.            p3 (cdr (assoc 12 ent))
  122.            p4 (cdr (assoc 13 ent))
  123.    )
  124.    
  125.    (setq en1 (entmakex
  126.                 (list
  127.                   (cons 0 "3DFACE")  
  128.                   (cons 10 (list (car p1) (cadr p1) 0.))
  129.                   (cons 11 (list (car p2) (cadr p2) 0.))
  130.                   (cons 12 (list (car p3) (cadr p3) 0.))
  131.                   (cons 13 (list (car p4) (cadr p4) 0.))
  132.                 )
  133.              )
  134.    )
  135.    (vl-cmdf "_loft" en  en1 "_MO" "_SOLID" "" "")
  136.    (entlast)
  137. )  
  138.  

ymg
« Last Edit: April 29, 2015, 07:12:05 PM by ymg »

ymg

  • Guest
Re: Triangulation (re-visited)
« Reply #379 on: April 30, 2015, 05:05:14 AM »
I had remove some necessary function during
the clean-up (Namely massoc-fuzz) so

I have corrected the attachment in post #374

ymg

ymg

  • Guest
Re: Triangulation (re-visited)
« Reply #380 on: April 30, 2015, 03:36:33 PM »
Topographer,

Concerning the oasis, holes or island however we name them,
it can be done with the program as it is.

The holes is actually a polyline that encircles an area without
points.

This is actually a close breakline without any points inside.

Only thing missing is as you create the CDT, 3dfaces will be created
inside the breaklines.  In other word the inside of your polyline
defining the breakline will be triangulated also.

All you need to do is to erase these inside triangles
manually upon completion. Should be easy if you
use the breakline as a selecting polygon.

ymg
« Last Edit: April 30, 2015, 05:07:38 PM by ymg »

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: Triangulation (re-visited)
« Reply #381 on: May 01, 2015, 12:44:53 PM »
Here is my newest version of convex triangulation terrain modeling routine... It should be ab 5 times faster than LOFT variant... Only thing that now it uses SURFSCULPT command, so you should have ACAD that supports this...

Code - Auto/Visual Lisp: [Select]
  1. (defun c:terrain ( / mid 3D->2D MR:Collinear-p MR:ListClockwise-p LM:Clockwise-p LM:ConvexHull triangulate ss i p pl ell tl och elmin elmax elevmin elevmax fuzz ss3f ent entl entll ti z )
  2.  
  3.   (defun mid ( p1 p2 )
  4.     (mapcar '(lambda ( a b ) (/ (+ a b) 2.0)) p1 p2)
  5.   )
  6.  
  7.   ;; 3D to 2D point  -  M.R.
  8.   ;; Returns 2D point list from supplied 3D point list or returns supplied argument if it isn't 3D point list
  9.  
  10.   (defun 3D->2D ( p )
  11.       (if (and (listp p) (vl-every '(lambda ( x ) (eq (type x) 'REAL)) p) (eq (length p) 3))
  12.           (list (car p) (cadr p))
  13.           p
  14.       )
  15.   )
  16.  
  17.   ;; Collinear-p  -  M.R.
  18.   ;; Returns T if p1,p2,p3 are collinear
  19.  
  20.   (defun MR:Collinear-p ( p1 p2 p3 )
  21.       (equal  (distance p1 p3)
  22.               (+ (distance p1 p2) (distance p2 p3))
  23.           1e-8
  24.       )
  25.   )
  26.  
  27.   ;; MR:ListClockwise-p
  28.  
  29.   (defun MR:ListClockwise-p ( lst / z vlst )
  30.     (vl-catch-all-apply 'minusp
  31.       (list
  32.         (if
  33.           (not
  34.             (equal 0.0
  35.               (setq z
  36.                 (apply '+
  37.                   (mapcar
  38.                     (function
  39.                       (lambda ( u v )
  40.                         (- (* (car  u) (cadr  v)) (* (car  v) (cadr  u)))
  41.                       )
  42.                     )
  43.                     (setq vlst
  44.                       (mapcar
  45.                         (function
  46.                           (lambda ( a b ) (mapcar '- b a))
  47.                         )
  48.                         (mapcar (function (lambda ( x ) (car lst))) lst)
  49.                         (cdr (reverse (cons (car lst) (reverse lst))))
  50.                       )
  51.                     )
  52.                     (cdr (reverse (cons (car vlst) (reverse vlst))))
  53.                   )
  54.                 )
  55.               ) 1e-6
  56.             )
  57.           )
  58.           z
  59.           (progn
  60.             (prompt "\n\nChecked vectors are colinear - unable to determine clockwise-p of list")
  61.             nil
  62.           )
  63.         )
  64.       )
  65.     )
  66.   )
  67.  
  68.   ;; Clockwise-p  -  Lee Mac
  69.   ;; Returns T if p1,p2,p3 are clockwise oriented or collinear
  70.  
  71.   (defun LM:Clockwise-p ( p1 p2 p3 )
  72.       (<  (-  (* (- (car  p2) (car  p1)) (- (cadr p3) (cadr p1)))
  73.               (* (- (cadr p2) (cadr p1)) (- (car  p3) (car  p1)))
  74.           )
  75.           1e-8
  76.       )
  77.   )
  78.  
  79.   ;; Convex Hull  -  Lee Mac
  80.   ;; Implements the Graham Scan Algorithm to return the Convex Hull of a list of points.
  81.    
  82.   (defun LM:ConvexHull ( lst / ch p0 )
  83.       (cond
  84.           (   (< (length lst) 4) lst)
  85.           (   (setq p0 (car lst))
  86.               (foreach p1 (cdr lst)
  87.                   (if (or (< (cadr p1) (cadr p0))
  88.                           (and (equal (cadr p1) (cadr p0) 1e-8) (< (car p1) (car p0)))
  89.                       )
  90.                       (setq p0 p1)
  91.                   )
  92.               )
  93.               (setq lst (vl-remove p0 lst))
  94.               (setq lst (append (list p0) lst))
  95.               (setq lst
  96.                   (vl-sort lst
  97.                       (function
  98.                           (lambda ( a b / c d )
  99.                               (if (equal (setq c (angle p0 a)) (setq d (angle p0 b)) 1e-8)
  100.                                   (< (distance p0 a) (distance p0 b))
  101.                                   (< (if (equal c (* 2.0 pi) 1e-8) 0.0 c) (if (equal d (* 2.0 pi) 1e-8) 0.0 d))
  102.                               )
  103.                           )
  104.                       )
  105.                   )
  106.               )
  107.               (setq ch (list (caddr lst) (cadr lst) (car lst)))
  108.               (foreach pt (cdddr lst)
  109.                   (setq ch (cons pt ch))
  110.                   (while (and (caddr ch) (LM:Clockwise-p (caddr ch) (cadr ch) pt) (not (MR:Collinear-p (3D->2D (caddr ch)) (3D->2D (cadr ch)) (3D->2D pt))))
  111.                       (setq ch (cons pt (cddr ch)))
  112.                   )
  113.               )
  114.               (reverse ch)
  115.           )
  116.       )
  117.   )
  118.  
  119.   (defun triangulate ( pl factor / tl pll getcircumcircle xmin xmax ymin ymax cs pmin pmax t1 t2 t3 al p el tr l n str ich iche i )
  120.  
  121.     (defun getcircumcircle ( p el / circumcircle cp cr rr )
  122.        
  123.       (defun circumcircle ( p1 p2 p3 / ang c r )
  124.         (if
  125.           (not
  126.             (zerop
  127.               (setq ang (- (angle p2 p3) (angle p2 p1)))
  128.             )
  129.           )
  130.           (setq c (polar p3 (+ -1.570796326794896 (angle p3 p1) ang) (setq r (/ (distance p1 p3) (sin ang) 2.0)))
  131.                r (abs r)
  132.           )
  133.         )
  134.         (list c r)
  135.       )
  136.  
  137.       (setq cp (car (setq cr (circumcircle (3D->2D p) (3D->2D (car el)) (3D->2D (cadr el))))) rr (cadr cr))
  138.       (list (+ (car cp) rr) cp rr (list p (car el) (cadr el))) ;;; Added X max of circumscribed triangle circle as first element of (getcircumcircle) output list ;;;
  139.     )
  140.  
  141.     (setq pll pl)
  142.     (setq xmin (caar (setq pl (vl-sort pl '(lambda ( a b ) (< (car a) (car b))))))) ;;; Sorted pl by X ;;;
  143.     (setq xmax (caar (vl-sort pl '(lambda ( a b ) (> (car a) (car b))))))
  144.     (setq ymin (cadar (vl-sort pl '(lambda ( a b ) (< (cadr a) (cadr b))))))
  145.     (setq ymax (cadar (vl-sort pl '(lambda ( a b ) (> (cadr a) (cadr b))))))
  146.     (setq cs (list (+ xmin (/ (- xmax xmin) 2.0)) (+ ymin (/ (- ymax ymin) 2.0))))
  147.     (setq pmin (list xmin ymin) pmax (list xmax ymax))
  148.     (setq t1 (polar cs 0.0 (if (setq n (atoi (substr (setq str (rtos (distance pmin cs) 1 0)) (- (strlen str) 2)))) (setq rs (expt factor (+ n 2)))))) ;;; Added 0.0 in polar for rotating supertriangle t1 is max X apex ;;;
  149.     ;;(setq t1 (polar cs 0.0 (setq rs (* 2.0 factor (distance pmin cs)))))
  150.     (setq t2 (polar cs (+ 0.0 (/ (* 2.0 pi) 3.0)) rs))
  151.     (setq t3 (polar cs (+ 0.0 (/ (* 4.0 pi) 3.0)) rs))
  152.     (setq al (list (list (car t1) cs rs (list t1 t2 t3))))
  153.     (while pl
  154.       (setq p (car pl))
  155.       (setq pl (cdr pl))
  156.       (setq el nil)
  157.       (while al
  158.         (setq tr (car al))
  159.         (setq al (cdr al))
  160.         (cond
  161.           ( (< (car tr) (car p)) ;;; Comparison of X values ;;;
  162.             (setq tl (cons (cadddr tr) tl))
  163.           )
  164.           ( (< (distance p (cadr tr)) (caddr tr))
  165.             (setq el (append (list
  166.                               (list (car (last tr)) (cadr (last tr)))
  167.                               (list (cadr (last tr)) (caddr (last tr)))
  168.                               (list (caddr (last tr)) (car (last tr)))
  169.                             ) el
  170.                     )
  171.             )
  172.           )
  173.           ( t (setq l (cons tr l)) )
  174.         )
  175.       )
  176.       (if l (setq al l l nil))
  177.       (while el
  178.         (if (or (member (reverse (car el)) el)
  179.                (member (car el) (cdr el))
  180.             )
  181.             (setq el (vl-remove (reverse (car el)) el)
  182.                   el (vl-remove (car el) el)
  183.             )
  184.             (setq al (cons (getcircumcircle p (car el)) al)
  185.                   el (cdr el)
  186.             )
  187.         )
  188.       )
  189.     )
  190.     (foreach tr al (setq tl (cons (cadddr tr) tl)))
  191.     (setq tl (vl-remove-if '(lambda ( x ) (or (member t1 x) (member t2 x) (member t3 x))) tl))
  192.     (setq pl pll)
  193.     (if (null ell)
  194.       (progn
  195.         (setq el (mapcar '(lambda ( a b ) (list a b)) (setq och (LM:ConvexHull pll)) (cdr (reverse (cons (car och) (reverse och))))))
  196.         (mapcar '(lambda ( x ) (setq pll (vl-remove x pll))) och)
  197.         (setq ich (LM:ConvexHull pll))
  198.       )
  199.     )
  200.     (if ich
  201.       (progn
  202.         (setq ell t)
  203.         (foreach e el
  204.           (if (not (vl-some '(lambda ( x ) (and (member (car e) x) (member (cadr e) x))) tl))
  205.             (progn
  206.               (setq ich (vl-sort ich '(lambda ( a b ) (< (distance a (mid (3D->2D (car e)) (3D->2D (cadr e)))) (distance b (mid (3D->2D (car e)) (3D->2D (cadr e))))))))
  207.               (setq iche (vl-remove-if '(lambda ( x ) (> (distance x (mid (3D->2D (car e)) (3D->2D (cadr e)))) (distance (car e) (mid (3D->2D (car e)) (3D->2D (cadr e)))))) ich))
  208.               (foreach p iche
  209.                 (if (or
  210.                       (and
  211.                         (vl-some '(lambda ( x ) (if (and (member (car e) x) (member p x)) (setq tr x))) tl)
  212.                         (vl-some '(lambda ( x ) (and (member (car e) x) (member p x))) (vl-remove tr tl))
  213.                       )
  214.                       (and
  215.                         (vl-some '(lambda ( x ) (if (and (member (cadr e) x) (member p x)) (setq tr x))) tl)
  216.                         (vl-some '(lambda ( x ) (and (member (cadr e) x) (member p x))) (vl-remove tr tl))
  217.                       )
  218.                     )
  219.                     (setq iche (vl-remove p iche))
  220.                 )
  221.               )
  222.               (setq i (length iche))
  223.               (setq iche (cons (car e) iche) iche (cons (cadr e) iche))
  224.               (if (null z)
  225.                 (setq z 10.0)
  226.               )
  227.               (setq z
  228.                 (cond
  229.                   ( (<= i (length (car (triangulate iche 10.0))))
  230.                     (if (>= z 10.0)
  231.                       z
  232.                       (setq z 10.0)
  233.                     )
  234.                   )
  235.                   ( (<= i (length (car (triangulate iche 25.0))))
  236.                     (if (>= z 25.0)
  237.                       z
  238.                       (setq z 25.0)
  239.                     )
  240.                   )
  241.                   ( (<= i (length (car (triangulate iche 50.0))))
  242.                     (if (>= z 50.0)
  243.                       z
  244.                       (setq z 50.0)
  245.                     )
  246.                   )
  247.                   ( (<= i (length (car (triangulate iche 100.0))))
  248.                     (if (>= z 100.0)
  249.                       z
  250.                       (setq z 100.0)
  251.                     )
  252.                   )
  253.                   ( (<= i (length (car (triangulate iche 250.0))))
  254.                     (if (>= z 250.0)
  255.                       z
  256.                       (setq z 250.0)
  257.                     )
  258.                   )
  259.                   ( (<= i (length (car (triangulate iche 500.0))))
  260.                     (if (>= z 500.0)
  261.                       z
  262.                       (setq z 500.0)
  263.                     )
  264.                   )
  265.                   ( (<= i (length (car (triangulate iche 1000.0))))
  266.                     (if (>= z 1000.0)
  267.                       z
  268.                       (setq z 1000.0)
  269.                     )
  270.                   )
  271.                 )
  272.               )
  273.             )
  274.           )
  275.         )
  276.       )
  277.     )
  278.     (list tl z)
  279.   ) ;;; end of triangulate
  280.  
  281.  
  282.   (prompt "\n................................................")
  283.   (prompt "\nTERRAIN TRIANGULATION IRREGULAR NETWORK MODELING")
  284.   (prompt "\n................................................")
  285.   (prompt "\n................................................")
  286.   (prompt "\nSELECT RANDOM 3D POINTS...")
  287.   (command "_.UCS" "_W")
  288.   (setq ss (ssget '((0 . "POINT"))))
  289.   (repeat (setq i (sslength ss))
  290.     (setq p (cdr (assoc 10 (entget (ssname ss (setq i (1- i)))))))
  291.     (setq pl (cons p pl))
  292.   )
  293.  
  294.   (setq elevmin (caddar (setq pl (vl-sort pl '(lambda ( a b ) (< (caddr a) (caddr b)))))))
  295.   (setq elevmax (caddr (last pl)))
  296.   (setq elmin (getreal (strcat "\nInput base elevation of terrain (must be < " (rtos elevmin 2 15) " ) : ")))
  297.   (while (>= elmin elevmin)
  298.     (setq elmin (getreal (strcat "\nInput base elevation of terrain (must be < " (rtos elevmin 2 15) " ) : ")))
  299.   )
  300.   (setq elmax (getreal (strcat "\nInput top elevation of terrain (must be > " (rtos elevmax 2 15) " ) : ")))
  301.   (while (<= elmax elevmax)
  302.     (setq elmax (getreal (strcat "\nInput top elevation of terrain (must be > " (rtos elevmax 2 15) " ) : ")))
  303.   )
  304.   (initget 4)
  305.   (setq fuzz (getreal "\nSpecify fuzz edge inaccuracy to make possible creation of 3DSOLID with SURFSCULPT command <0.0> : "))
  306.   (if (null fuzz) (setq fuzz 0.0))
  307.  
  308.   (setq ti (car (_vl-times)))
  309.   (setq ss3f (ssadd))
  310.   (setq z (cadr (triangulate pl 10.0)))
  311.   (foreach tr (car (triangulate pl z))
  312.     (ssadd
  313.       (entmakex
  314.         (list (cons 0 "3DFACE")
  315.           (cons 10 (car tr))
  316.           (cons 11 (cadr tr))
  317.           (cons 12 (caddr tr))
  318.           (cons 13 (car tr))
  319.         )
  320.       )
  321.       ss3f
  322.     )
  323.   )
  324.  
  325.   (setq entl (entmakex
  326.                (append
  327.                  (list
  328.                    '(0 . "LWPOLYLINE")
  329.                    '(100 . "AcDbEntity")
  330.                    '(100 . "AcDbPolyline")
  331.                    (cons 90 (length och))
  332.                    '(70 . 1)
  333.                    (cons 38 elmin)                  
  334.                  )
  335.                  (mapcar '(lambda ( p ) (list 10 (car p) (cadr p))) och)
  336.                  (list
  337.                    (list 210 0.0 0.0 1.0)
  338.                  )
  339.                )
  340.              )
  341.   )
  342.   (if (not (zerop fuzz))
  343.     (progn
  344.       (if (MR:ListClockwise-p och)
  345.         (vla-offset (vlax-ename->vla-object entl) fuzz)
  346.         (vla-offset (vlax-ename->vla-object entl) (- fuzz))
  347.       )
  348.       (vla-move (vlax-ename->vla-object entl) (vlax-3d-point (list 0.0 0.0 0.0)) (vlax-3d-point (list 0.0 0.0 fuzz)))
  349.       (setq entll entl)
  350.       (setq entl (entlast))
  351.     )
  352.   )
  353.   (command "_.EXTRUDE" entl "" "_D" (list 0.0 0.0 elmin) (list 0.0 0.0 elmax))
  354.   (command "_.EXPLODE" (entlast))
  355.   (while (> (getvar 'cmdactive) 0) (command ""))
  356.   (if (not (zerop fuzz))
  357.     (progn
  358.       (command "_.UCS" "_M" (list 0.0 0.0 elmin))
  359.       (repeat (setq i (sslength (setq entl (ssget "_P"))))
  360.         (setq ent (ssname entl (setq i (1- i))))
  361.         (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-get-centroid (list (vlax-ename->vla-object ent)))))
  362.           (progn
  363.             (ssdel ent entl)
  364.             (entdel ent)
  365.           )
  366.         )
  367.       )
  368.       (command "_.UCS" "_P")
  369.     )
  370.   )
  371.   (command "_.UCS" "_M" (list 0.0 0.0 elmax))
  372.   (repeat (setq i (sslength (if (eq (type entl) 'PICKSET) entl (setq entl (ssget "_P")))))
  373.     (setq ent (ssname entl (setq i (1- i))))
  374.     (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-get-centroid (list (vlax-ename->vla-object ent)))))
  375.       (progn
  376.         (ssdel ent entl)
  377.         (entdel ent)
  378.       )
  379.     )
  380.   )
  381.   (if (not (zerop fuzz))
  382.     (progn
  383.       (command "_.REGION" entll "")
  384.       (ssadd (setq ent (entlast)) entl)
  385.     )
  386.     (setq ent (entlast))
  387.   )
  388.  
  389.   (command "_.REGION" ss3f "")
  390.   (while (setq ent (entnext ent))
  391.     (ssadd ent entl)
  392.   )
  393.  
  394.   (command "_.UCS" "_P")
  395.   (command "_.SURFSCULPT" entl "")
  396.   (command "_.UCS" "_P")
  397.  
  398.   (prompt (strcat "\nElapsed time: " (rtos (/ (- (car (_vl-times)) ti) 1000.) 2 4) " secs."))
  399.   (princ)
  400. )
  401.  

HTH, Regards, M.R.
« Last Edit: February 16, 2016, 05:33:48 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ymg

  • Guest
Re: Triangulation (re-visited)
« Reply #382 on: May 01, 2015, 04:12:54 PM »
Marko,

Looks good to me I am running 2012, so surfsculpt.

However I've not done a lot of 3d-modeling except
for the occasionnal simple model.

You are much more proficient at it than I am.

Is surfsculpt available to Briscad ?

Would like to keep thing compatible with it.

ymg

motee-z

  • Newt
  • Posts: 40
Re: Triangulation (re-visited)
« Reply #383 on: May 01, 2015, 05:37:11 PM »
Hello ymg
when executing the routine i got this message any reason for this i use autocad2013 version
Error: no function definition: MASSOC-FUZZ

ymg

  • Guest
Re: Triangulation (re-visited)
« Reply #384 on: May 01, 2015, 06:50:07 PM »
motee-z,

Download the file again as I had removed the function
by mistakes.

Anyway in next revision probably tomorrow, this
function will no longer be required.

I hope to complete the automatic clean-up of
triangles inside holes of the triangulation in this
next revision.

A note of caution, there has been some revision to
the DCL.  So if you had run any of the older version,
you need to erase the tin.dcl  file that is in your temp directory.

ymg
« Last Edit: May 01, 2015, 06:55:45 PM by ymg »

ymg

  • Guest
Re: Triangulation (re-visited)
« Reply #385 on: May 02, 2015, 01:29:56 PM »
As pledged, here is Revision 0.6.2.8 of triangulation
program.

Islands are now cleaned up after triangulation.

ymg

pedroantonio

  • Guest
Re: Triangulation (re-visited)
« Reply #386 on: May 02, 2015, 02:05:00 PM »
Hi ymg nice update , but i have a bug. The problem is when the breaklines is in touch with the boundary. Look the test.dwg


pedroantonio

  • Guest
Re: Triangulation (re-visited)
« Reply #387 on: May 02, 2015, 02:26:37 PM »
Hi ymg ,I havesome  questions.
1)I draw a 2d polyline on the contours and then i write prof to draw a long section, and gives me this message Error: divide by zero.
With the previous versions i didn't have this error.
2)I use attribiute block for my insert survey points.With the previous versions i didn't have any problems.Now i  need to turn off the layers of this block.Is this necessary

Look the test2.dwg with the 2d polyline and the layoff layers

Thanks

ymg

  • Guest
Re: Triangulation (re-visited)
« Reply #388 on: May 02, 2015, 05:47:55 PM »
Topographer,

Seems to be a valid bug.  I believe it has to do
when there is no triangle inside the closed breaklines.

Right now I'm tired, so I'll look more closely
tomorrow.

Ditto, for the second bug.

ymg

ymg

  • Guest
Re: Triangulation (re-visited)
« Reply #389 on: May 03, 2015, 07:48:40 AM »
Topographer,

Corrected the first bug that you submitted.

For the second, the problem is that the insert point
of your block are 2d.

Your blocks must be inserted at the proper elevation (3D)

As it is Blocks are left on whatever layer there were inserted to.
We could change this behaviour and move them to the "Tin Point ..."
layers.

We do not need to create a "POINT"  entity in order to triangulate
all I am using is the coordinates of insertion.

If we move the blocks to the "Tin Point ..." layers the c:tog command
could be used to make them appear or dissappear. 

We could, as you go in command c:prof, turn "Off" layer  "Tin Point ..."
to diminish the clutter on screen.  Although it is not absolutely necessary.

ymg
« Last Edit: May 03, 2015, 08:01:23 AM by ymg »