Saxlle Posted January 20 Posted January 20 (edited) Hello everyone, I'm currently working on creating a 3DFACE entities between two selected 3DPOLYLINE's. Also, I know it can be made with Civil 3D and there is a Triang V0.5.9.lsp file for that purpose. After a while, I'm continiue to work on this. I have a problem in making "proper" 3DFACE entities, sometime it's good, sometimes it's not. I would like someone to check those two uploaded files (.dwg and .lsp), try it and then help me with a solution to make a "proper" 3DFACE entities. Inside the M3DFACE.lsp there is a functions: - SX:M3DFACEFPL (creating 3DFACE's from two selected LWPOLYLINE); - SX:M3DFACEF3DPL (creating 3DFACE's from selected 3DPOLYLINE); - SX:OFFSET3DPL (offset "base" 3DPOLYLINE 2.0 m on the desired side and make a new 3DPOLYLINE to make a breaklines for making 3DFACE's. Also, after the offset was done, it takes the Z value from "base" offseted 3DPOLYLINE, and that is OK for this solution); - SX:ERASENEW3DPL (deleting previous offseted new 3DPOLYLINE after the 3DFACE's were made); - SX:ROUND (not involved in application); - myerr (catching an error). Inside "TEST_3DFACE.dwg" I left the 3DFACE entities after running the above functions, just so you can see what I get (bad 3DFACE's was colored into yellow). Thanks in advance. TEST_3DFACE.dwgUnavailable M3DFACE.lspUnavailable Edited January 20 by Saxlle Quote
GLAVCVS Posted January 20 Posted January 20 (edited) When you choose the 'Polyline' option you must select two different polylines. If you select two segments of the same polyline the code will not work correctly. Also, it will not work if the polylines have different elevations. Edited January 20 by GLAVCVS Quote
BIGAL Posted January 21 Posted January 21 I think the answer you need is to work on a flat breakline working out new points on the 3d values of a 3dface. As I have used civil software for most of my life why are you reinventing the wheel when out of box answers are there ? Quote
Saxlle Posted January 21 Author Posted January 21 On 1/20/2025 at 9:21 PM, GLAVCVS said: When you choose the 'Polyline' option you must select two different polylines. If you select two segments of the same polyline the code will not work correctly. This is obvious, it will not work properly. I can put some restrictions (if one single polyline choosen 2x times), but i don't need them. On 1/20/2025 at 9:21 PM, GLAVCVS said: Also, it will not work if the polylines have different elevations. Can you be more specific? I don't see a problem with that, but 3DFACE's can seem odd. Quote
Saxlle Posted January 21 Author Posted January 21 On 1/21/2025 at 12:07 AM, BIGAL said: As I have used civil software for most of my life why are you reinventing the wheel when out of box answers are there ? This is because civil designer using Civil 3D trough all time on work. I'm traffic designer, and currently dealing with this changing and can't use the licence for Civil. This is the short explanation, don't want to go in details. On 1/21/2025 at 12:07 AM, BIGAL said: I think the answer you need is to work on a flat breakline working out new points on the 3d values of a 3dface. Can you @BIGAL give me more information about this? Quote
BIGAL Posted January 21 Posted January 21 Breaklines as a rule go from a point to a point. They are not random lines across a TIN. If your 3dplines pts are not part of the TIN then they need to be. A Breakline for others is an edge object. But the triangles have not connected correctly. So extra triangles are made. Green line is say "top of bank" ie a breakline. Sorry you will have to work out the new triangles. Quote
LanloyLisp Posted January 21 Posted January 21 I believe both selected 3D polylines should have approximately the same number of vertices to generate better 3D faces. Quote
BIGAL Posted January 21 Posted January 21 If your talking about the yellow 3d faces then something has gone horribly wrong during TIN creation they should not look like that. The triangles should have a side with shortest distance. ie between the 2 lines, I would remake the TIN again some thing is wrong about the TIN. Quote
Saxlle Posted January 22 Author Posted January 22 On 1/21/2025 at 8:47 AM, LanloyLisp said: I believe both selected 3D polylines should have approximately the same number of vertices to generate better 3D faces. If the number of vertices is equal, 3DFACES are good. But, it is not common, especially when you "offseting base" 3DPOLYLINE, LWPOLYLINE, etc. Quote
Saxlle Posted January 22 Author Posted January 22 On 1/21/2025 at 9:19 AM, BIGAL said: If your talking about the yellow 3d faces then something has gone horribly wrong during TIN creation they should not look like that. Yes, the yellow 3DFACES, and it's not good. On 1/21/2025 at 9:19 AM, BIGAL said: The triangles should have a side with shortest distance This sounds okay and I think it should be checked before I create 3DFACES in a "while loop", but I need some advice or guidance on what to check (I'm currently stuck here). **Part from M3DFACE.lsp (while (< i len) (if (/= (nth (1+ i) ptlistOne) nil) (entmake (list (cons 0 "3DFACE") (cons 10 (nth i ptlistOne)) (cons 11 (nth j ptlistSecond)) (cons 12 (nth (1+ i) ptlistSecond)) (cons 13 (nth i ptlistOne)))) ) (if (and (/= (nth (1+ i) ptlistOne) nil) (/= (nth (1+ j) ptlistSecond) nil)) (entmake (list (cons 0 "3DFACE") (cons 10 (nth (1+ i) ptlistOne)) (cons 11 (nth (1+ j) ptlistSecond)) (cons 12 (nth i ptlistOne)) (cons 13 (nth (1+ i) ptlistOne)))) ) (setq i (1+ i) j (1+ j) ) ) Quote
GLAVCVS Posted January 22 Posted January 22 (edited) On 1/21/2025 at 7:21 AM, Saxlle said: Sorry for not answering earlier. I think I misunderstood your drawing at first. I think you should introduce some proximity filter in the code to decide which polyline the first 2 points of the triangle are taken from. This would prevent the formation of implausible or transgressive triangles. Edited January 22 by GLAVCVS Quote
GLAVCVS Posted January 22 Posted January 22 I've thought better of it. I think the best way to filter the choice of triangles is by the angle relationship between their vertices. This way the problem of the difference in the number of vertices of each 3D polyline will be greatly minimized. That's why I've dared to modify your 'SX:M3DFACEF3DPL' function by adding a couple of new functions that serve to select the vertices of each '3DFACE' I haven't tested it in depth. So it's possible that some unforeseen situation may arise. If so, let me know and I'll help you find a solution. (defun SX:M3DFACEF3DPL (/ enameOne enameSecond old_layer layerNameBase dataOne ptOne ptlistOne dataSecond ptSecond ptlistSecond len i j pt1 pt2 pt3 ind1 ind2 ang_sub_ref decideTRI ) (defun ang_sub_ref (pta ptb pt1 / ang_result ang_ref ang ang_desde_ptb ) (if ptb (progn (setq ang_ref (angle pta ptb) ang_desde_ptb (angle ptb pt1) ) (cond ((< (abs (setq ang (- ang_ref ang_desde_ptb))) PI) ang ) ((and (> (abs (setq ang (- ang_ref ang_desde_ptb))) PI) (<= ang_ref PI) ) (+ ang_ref (- (* 2 PI) ang_desde_ptb)) ) ((and (> (abs (setq ang (- ang_ref ang_desde_ptb))) PI) (> ang_ref PI) ) (- (- ang_ref (* 2 PI)) ang_desde_ptb) ) (T (PRINC "\n**Caso no esperado en ang_sub_ref") ) ) (if ang (if (> (setq ang (abs ang)) (* 2 PI)) (setq ang (abs (- (- ang (* 2 PI)) PI))) (abs (- ang pi)) ) ) ) 1000 ) ) (defun decideTRI (/ a b) (if (= (min (setq a (abs (- (ang_sub_ref (nth ind1 ptlistOne) (nth (1+ ind1) ptlistOne) (nth ind2 ptlistSecond) ) (/ pi 2.0) ) ) ) (setq b (abs (- (ang_sub_ref (nth ind2 ptlistSecond) (nth (1+ ind2) ptlistSecond) (nth ind1 ptlistOne) ) (/ pi 2.0) ) ) ) ) a ) (setq pt1 (nth ind1 ptlistOne) pt2 (nth (1+ ind1) ptlistOne) pt3 (nth ind2 ptlistSecond) ind1 (+ ind1 1) ) (setq pt1 (nth ind2 ptlistSecond) pt2 (nth (1+ ind2) ptlistSecond) pt3 (nth ind1 ptlistOne) ind2 (+ ind2 1) ) ) ) (command-s "_UNDO" "BE") (setq enameOne (car (entsel "\nSelect the first 3DPOLYLINE:")) enameSecond (car (entsel "\nSelect the second 3DPOLYLINE:")) ) (while (or (= enameOne nil) (not (= "POLYLINE" (cdr (assoc 0 (entget enameOne))))) ) (if (= enameOne nil) (progn (prompt "\nNothing was selected. Try again...") (setq enameOne (car (entsel "\nSelect the first 3DPOLYLINE:"))) (princ) ) (progn (prompt "\nSelected entity must be 3DPOLYLINE. Try again..." ) (setq enameOne (car (entsel "\nSelect the first 3DPOLYLINE:"))) (princ) ) ) ) (while (or (= enameSecond nil) (not (= "POLYLINE" (cdr (assoc 0 (entget enameSecond))))) ) (if (= enameSecond nil) (progn (prompt "\nNothing was selected. Try again...") (setq enameSecond (car (entsel "\nSelect the second 3DPOLYLINE:")) ) (princ) ) (progn (prompt "\nSelected entity must be 3DPOLYLINE. Try again..." ) (setq enameSecond (car (entsel "\nSelect the second 3DPOLYLINE:")) ) (princ) ) ) ) (setq old_layer (getvar 'clayer) layerNameBase (cdr (assoc 8 (entget enameOne))) ) (setvar 'clayer layerNameBase) ;;; (setq objOne (vlax-ename->vla-object enameOne) ;;; objSecond (vlax-ename->vla-object enameOne) ;;; ) (setq dataOne (entget enameOne)) (while (/= (cdr (assoc 0 dataOne)) "SEQEND") (setq ptOne (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) dataOne) ) ) (if (/= (nth 0 (nth 0 ptOne)) 0.0) (setq ptlistOne (cons ptOne ptlistOne)) ) (setq dataOne (entget (entnext (cdr (assoc -1 dataOne))))) ) (setq ptlistOne (mapcar 'car ptlistOne)) ; lista de puntos de la primera polilínea 3D (setq dataSecond (entget enameSecond)) (while (/= (cdr (assoc 0 dataSecond)) "SEQEND") (setq ptSecond (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) dataSecond ) ) ) (if (/= (nth 0 (nth 0 ptSecond)) 0.0) (setq ptlistSecond (cons ptSecond ptlistSecond)) ) (setq dataSecond (entget (entnext (cdr (assoc -1 dataSecond))))) ) (setq ptlistSecond (mapcar 'car ptlistSecond)) ; lista de puntos de la segunda polilínea 3D (setq ptlistOne (reverse ptlistOne)) (setq ptlistSecond (reverse ptlistSecond)) ;;; (if (> (length ptlistOne) (length ptlistSecond)) ;;; (progn ;;; (setq len (length ptlistOne) ;;; i 0 ;;; j 0 ;;; ) ;;; ) ;;; (progn ;;; (setq len (length ptlistSecond) ;;; i 0 ;;; j 0 ;;; ) ;;; ) ;;; ) ;;; (while (< i len) ;;; (if (/= (nth (1+ i) ptlistOne) nil) ;;; (entmake (list (cons 0 "3DFACE") ;;; (cons 10 (nth i ptlistOne)) ;;; (cons 11 (nth j ptlistSecond)) ;;; (cons 12 (nth (1+ i) ptlistSecond)) ;;; (cons 13 (nth i ptlistOne)) ;;; ) ;;; ) ;;; ) ;;; (if (and (/= (nth (1+ i) ptlistOne) nil) ;;; (/= (nth (1+ j) ptlistSecond) nil) ;;; ) ;;; (entmake (list (cons 0 "3DFACE") ;;; (cons 10 (nth (1+ i) ptlistOne)) ;;; (cons 11 (nth (1+ j) ptlistSecond)) ;;; (cons 12 (nth i ptlistOne)) ;;; (cons 13 (nth (1+ i) ptlistOne)) ;;; ) ;;; ) ;;; ) ;;; (setq i (1+ i) ;;; j (1+ j) ;;; ) ;;; ) (setq ind1 0 ind2 0 ) (while (and (nth ind1 ptlistOne) (nth ind2 ptlistSecond) (or (nth (1+ ind1) ptlistOne) (nth (1+ ind2) ptlistSecond)) ) (decideTRI) (entmake (list (cons 0 "3DFACE") (cons 10 pt1) (cons 11 pt2) (cons 12 pt3) (cons 13 pt1) ) ) ) (setvar 'clayer old_layer) (command-s "_UNDO" "E") (princ) ) 1 Quote
BIGAL Posted January 23 Posted January 23 @GLAVCVS having spent some 40+ years playing with TIN's there is just something wrong with the creation of the original TIN model, using commercial surface TIN creation would not make the TIN between 2 3dpolys in the way that they have been made. If a free version of make a TIN is required then look at TriangV0.6.7.lsp by YMG. Before computers were fast have watched a TIN being made and it uses a spiraling out from middle when making triangles. To quote TriangV0.6.7.lsp ";; C:TIN, Generates Delaunay Triangulation and Voronoi Diagram." This is the two 3dpolylines TIN Made with TriangV0.6.7 you can see correct pattern. Quote
GLAVCVS Posted January 23 Posted January 23 On 1/23/2025 at 12:09 AM, BIGAL said: @GLAVCVS having spent some 40+ years playing with TIN's there is just something wrong with the creation of the original TIN model, using commercial surface TIN creation would not make the TIN between 2 3dpolys in the way that they have been made. If a free version of make a TIN is required then look at TriangV0.6.7.lsp by YMG. Before computers were fast have watched a TIN being made and it uses a spiraling out from middle when making triangles. To quote TriangV0.6.7.lsp ";; C:TIN, Generates Delaunay Triangulation and Voronoi Diagram." This is the two 3dpolylines TIN Made with TriangV0.6.7 you can see correct pattern. Expand Hi BIGAL Thanks for your suggestion I've searched for 'TriangV0.6.7.lsp' but I can't find it. Quote
Saxlle Posted January 23 Author Posted January 23 @GLAVCVS Thank you to your time and effort . I'v tested your updates, and it's work better than my original making of 3DFACES. From BIGAL previuoses post, i'v been thinking about "shortest distance" or "angles between vertices", but didn't know what to includ in comparision, until you did it. After testing, it happen next (picture 1): - in this situation it takes wrong element from the "list of points" (from code it is in ptlistOne and ptlistSecond) to make a 3DFACE. In my opinion, inside the sub-function "decideTRI ( / a b)" need to include a comparing between some other points in that case that we have sub-function "decideTRI ( / a b c (maybe d) (maybe e))" with options (c, d, e, ...) and to find "min" angle to make 3DFACE from correct list of points (maybe to put it in "cond" statement insted of "if" statement).. From picture 1, the yellow color of 3DFACES are good, the red color of 3DFACES are made after run the "SX:M3DFACEF3DPL" and the magenta color of 3DFACES is desired output (changed it manually just to show). I hope I explained well. Once again, thank you. Quote
SLW210 Posted January 23 Posted January 23 Did you look at CADTOOLS, it may have what you need? 1 Quote
GLAVCVS Posted January 23 Posted January 23 I think the solution to this problem is to determine what is inside and what is outside, in the direction of travel of each list of points. Once this criterion is established, it will be possible to filter out the offending triangles from 'decideTRI'. If you haven't solved the problem in any way, I'll try to do it myself this afternoon. Quote
GLAVCVS Posted January 25 Posted January 25 (edited) Here is the little modification that was missing: you already have the functionality But you should simplify the code a bit. One test you could do is to obtain the triangles using minimum circles to compare the differences. Do your tests (defun SX:M3DFACEF3DPL (/ enameOne enameSecond old_layer layerNameBase dataOne ptOne ptlistOne dataSecond ptSecond ptlistSecond len i j pt1 pt2 pt3 ind1 ind2 decideTRI ang_sub_ref ) (defun decideTRI (/ a b c d pt1Lst1 pt2Lst1 pt1Lst2 pt2Lst2 selecTRIbase->Lista1 selecTRIbase->Lista2 TRI_transgresor? ) (defun selecTRIbase->Lista1 () (setq pt1 pt1Lst1 pt2 pt2Lst1 pt3 pt1Lst2 ind1 (+ ind1 1) ) ) (defun selecTRIbase->Lista2 () (setq pt1 pt1Lst2 pt2 pt2Lst2 pt3 pt1Lst1 ind2 (+ ind2 1) ) ) (defun TRI_transgresor? (pt2 pt3 / lst1 lst2 n m pto1 pto2 lista para val ind pt2D) (defun pt2D (pt3D) (list (car pt3D) (cadr pt3D)) ) (setq pt2 (polar (pt2D pt2) (angle pt2 pt3) 0.01) pt3 (polar (pt2D pt3) (angle pt3 pt2) 0.01) lst1 (foreach ind '(-2 -1 0 1 2) (if (and (not (minusp (+ ind1 ind))) (setq val (nth (+ ind1 ind) ptlistOne)) ) (setq lst1 (append lst1 (list (pt2D val)))) ) ) lst2 (foreach ind '(-2 -1 0 1 2) (if (and (not (minusp (+ ind2 ind))) (setq val (nth (+ ind2 ind) ptlistSecond)) ) (setq lst2 (append lst2 (list (pt2D val)))) ) ) ) (setq m 0) (while (and (not para) (setq lista (nth m (list lst1 lst2)))) (setq n 0) (while (and (not para) (setq pto2 (nth (+ n 1) lista))) (setq pto1 (nth n lista)) (if (inters pt2 pt3 pto1 pto2) (setq para T) ) (setq n (+ n 1)) ) (setq m (+ m 1)) ) para ) (setq pt1Lst1 (nth ind1 ptlistOne) pt2Lst1 (nth (1+ ind1) ptlistOne) pt1Lst2 (nth ind2 ptlistSecond) pt2Lst2 (nth (1+ ind2) ptlistSecond) ) (if (and pt1Lst1 pt2Lst1 pt1Lst2 pt2Lst2) (if (= (min (setq a (abs (- (abs (ang_sub_ref (nth ind1 ptlistOne) (nth (1+ ind1) ptlistOne) (nth ind2 ptlistSecond) ) ) (/ pi 2.0) ) ) ) (setq b (abs (- (abs (ang_sub_ref (nth ind2 ptlistSecond) (nth (1+ ind2) ptlistSecond) (nth ind1 ptlistOne) ) ) (/ pi 2.0) ) ) ) ) a ) (if (not (TRI_transgresor? pt2Lst1 pt1Lst2)) (selecTRIbase->Lista1) (selecTRIbase->Lista2) ) (if (not (TRI_transgresor? pt2Lst2 pt1Lst1)) (selecTRIbase->Lista2) (selecTRIbase->Lista1) ) ) (setq lst (list pt1Lst1 pt2Lst1 pt1Lst2 pt2Lst2) lst (vl-remove nil lst) ind1 (+ ind1 10) ind2 (+ ind2 10) pt1 (nth 0 lst) pt2 (nth 1 lst) pt3 (nth 2 lst) ) ) ) (defun ang_sub_ref (pta ptb pt1 / ang_result ang_ref ang ang_desde_ptb) (setq ang_ref (angle pta ptb) ang_desde_ptb (angle ptb pt1) ) (cond ((< (abs (setq ang (- ang_ref ang_desde_ptb))) PI) ang ) ((and (> (abs (setq ang (- ang_ref ang_desde_ptb))) PI) (<= ang_ref PI) ) (+ ang_ref (- (* 2 PI) ang_desde_ptb)) ) ((and (> (abs (setq ang (- ang_ref ang_desde_ptb))) PI) (> ang_ref PI) ) (- (- ang_ref (* 2 PI)) ang_desde_ptb) ) (T (princ "\n***Caso no esperado en ang_sub_ref") ) ) ) ;;; (command-s "_UNDO" "BE") (setq enameOne (car (entsel "\nSelect the first 3DPOLYLINE:")) enameSecond (car (entsel "\nSelect the second 3DPOLYLINE:")) ) (while (or (= enameOne nil) (not (= "POLYLINE" (cdr (assoc 0 (entget enameOne))))) ) (if (= enameOne nil) (progn (prompt "\nNothing was selected. Try again...") (setq enameOne (car (entsel "\nSelect the first 3DPOLYLINE:"))) (princ) ) (progn (prompt "\nSelected entity must be 3DPOLYLINE. Try again..." ) (setq enameOne (car (entsel "\nSelect the first 3DPOLYLINE:"))) (princ) ) ) ) (while (or (= enameSecond nil) (not (= "POLYLINE" (cdr (assoc 0 (entget enameSecond))))) ) (if (= enameSecond nil) (progn (prompt "\nNothing was selected. Try again...") (setq enameSecond (car (entsel "\nSelect the second 3DPOLYLINE:")) ) (princ) ) (progn (prompt "\nSelected entity must be 3DPOLYLINE. Try again..." ) (setq enameSecond (car (entsel "\nSelect the second 3DPOLYLINE:")) ) (princ) ) ) ) (setq old_layer (getvar 'clayer) layerNameBase (cdr (assoc 8 (entget enameOne))) ) (setvar 'clayer layerNameBase) ;;; (setq objOne (vlax-ename->vla-object enameOne) ;;; objSecond (vlax-ename->vla-object enameOne) ;;; ) (setq dataOne (entget enameOne)) (while (/= (cdr (assoc 0 dataOne)) "SEQEND") (setq ptOne (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) dataOne) ) ) (if (/= (nth 0 (nth 0 ptOne)) 0.0) (setq ptlistOne (cons ptOne ptlistOne)) ) (setq dataOne (entget (entnext (cdr (assoc -1 dataOne))))) ) (setq ptlistOne (mapcar 'car ptlistOne)) ; lista de puntos de la primera polil铆nea 3D (setq dataSecond (entget enameSecond)) (while (/= (cdr (assoc 0 dataSecond)) "SEQEND") (setq ptSecond (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) dataSecond ) ) ) (if (/= (nth 0 (nth 0 ptSecond)) 0.0) (setq ptlistSecond (cons ptSecond ptlistSecond)) ) (setq dataSecond (entget (entnext (cdr (assoc -1 dataSecond))))) ) (setq ptlistSecond (mapcar 'car ptlistSecond)) ; lista de puntos de la segunda polil铆nea 3D (setq ptlistOne (reverse ptlistOne)) (setq ptlistSecond (reverse ptlistSecond)) ;;; (if (> (length ptlistOne) (length ptlistSecond)) ;;; (progn ;;; (setq len (length ptlistOne) ;;; i 0 ;;; j 0 ;;; ) ;;; ) ;;; (progn ;;; (setq len (length ptlistSecond) ;;; i 0 ;;; j 0 ;;; ) ;;; ) ;;; ) ;;; (while (< i len) ;;; (if (/= (nth (1+ i) ptlistOne) nil) ;;; (entmake (list (cons 0 "3DFACE") ;;; (cons 10 (nth i ptlistOne)) ;;; (cons 11 (nth j ptlistSecond)) ;;; (cons 12 (nth (1+ i) ptlistSecond)) ;;; (cons 13 (nth i ptlistOne)) ;;; ) ;;; ) ;;; ) ;;; (if (and (/= (nth (1+ i) ptlistOne) nil) ;;; (/= (nth (1+ j) ptlistSecond) nil) ;;; ) ;;; (entmake (list (cons 0 "3DFACE") ;;; (cons 10 (nth (1+ i) ptlistOne)) ;;; (cons 11 (nth (1+ j) ptlistSecond)) ;;; (cons 12 (nth i ptlistOne)) ;;; (cons 13 (nth (1+ i) ptlistOne)) ;;; ) ;;; ) ;;; ) ;;; (setq i (1+ i) ;;; j (1+ j) ;;; ) ;;; ) (setq ind1 0 ind2 0 ) (while (and (nth ind1 ptlistOne) (nth ind2 ptlistSecond) (or (nth (1+ ind1) ptlistOne) (nth (1+ ind2) ptlistSecond)) ) (decideTRI) (entmake (list (cons 0 "3DFACE") (cons 10 pt1) (cons 11 pt2) (cons 12 pt3) (cons 13 pt1) ) ) ;;; (getstring "\nPulsa INTRO") ) (setvar 'clayer old_layer) ;;; (command-s "_UNDO" "E") (princ) ) Edited January 25 by GLAVCVS 2 Quote
GLAVCVS Posted January 25 Posted January 25 On 1/25/2025 at 6:31 PM, GLAVCVS said: Aquí está la pequeña modificación que faltaba: ya tienes la funcionalidad Pero deberías simplificar un poco el código. Una prueba que podrías hacer es obtener los triángulos utilizando círculos mínimos para comparar las diferencias. Haz tus pruebas Expand NOTE: a slight modification has been made to avoid possible errors in the creation of the last triangle. Quote
Saxlle Posted January 26 Author Posted January 26 Hey @GLAVCVS, Thank you a lot for you'r time and effort in helping . I'v teseted your last update on TEST_3DFACE.dwg, and for now, it's working really great. Tomorrow I will test it on the others drawings at work. On 1/25/2025 at 6:31 PM, GLAVCVS said: One test you could do is to obtain the triangles using minimum circles to compare the differences. If I'm not wrong, did you mean something on to check if some other points belong "inside" the circle? If I owe you anything, please let me know. Best regards. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.