### Author Topic: [XDrX-Function(9)] Judgment of 9 topological relationships between two curves  (Read 494 times)

0 Members and 1 Guest are viewing this topic.

• Swamp Rat
• Posts: 527
##### [XDrX-Function(9)] Judgment of 9 topological relationships between two curves
« on: December 05, 2023, 10:22:45 AM »
Implemented using the AcGe geometry library AcGeCurveCurveInt3d

Function introduction: 9 kinds of relationships
0: internal
1: Internal fit
2: Intersect
3: External fit
4: External
5: There are gaps inside the joints
6: There are gaps in the external contact.
7: Inside but the distance is less than the tolerance, the tolerance value is set by (xdrx_setvar "toldist" dist)
8: Outside but the distance is less than the tolerance, the tolerance value is set by (xdrx_setvar "toldist" dist)

Code - Auto/Visual Lisp: [Select]
1. ;|
2. Function name: XD::Curve:Relation
3. Call format: (XD::Curve:Relation e1 e2)
4. Parameter Description:
5. e1 ---- Curve 1
6. e2 ---- Curve 2
7. Return value: 0-8
8. Function introduction: 9 kinds of relationships
9. 0: internal
10. 1: Internal fit
11. 2: Intersect
12. 3: External fit
13. 4: External
14. 5: There are gaps inside the joints
15. 6: There are gaps in the external contact.
16. 7: Inside but the distance is less than the tolerance, the tolerance value is set by (xdrx_setvar "toldist" dist)
17. 8: Outside but the distance is less than the tolerance, the tolerance value is set by (xdrx_setvar "toldist" dist)
18. Function source: original
19. Function author: XDSoft
20. Applicable versions: XDRX API
21. |;
22. (defun XD::Curve:Relation (e1 e2 / cfgs cfgs1 g1 g2 gint ints isGe isinnor is-inters isMInters
23.                            isnear isqua item numints ret verts1 verts2 x
24.                           )
25.   (cond ((XdGe::IsKindOf e1 "kCurve3d")
26.          (setq g1 e1
27.                isGe t
28.          )
29.         )
30.         ((= (type e1) 'ENAME) (setq g1 (xdge::constructor e1)))
31.         ((= (type e1) 'LIST)
32.          (setq g1 (xdge::constructor "kCompositeCrv3d" e1))
33.         )
34.   )
35.   (cond ((XdGe::IsKindOf e2 "kCurve3d")
36.          (setq g2 e2
37.                isGe t
38.          )
39.         )
40.         ((= (type e2) 'ENAME) (setq g2 (xdge::constructor e2)))
41.         ((= (type e2) 'LIST)
42.          (setq g2 (xdge::constructor "kCompositeCrv3d" e2))
43.         )
44.   )
45.   (if (and g1
46.            g2
47.            (setq gint (xdge::Constructor "kCurveCurveInt3d" g1 g2))
48.       )
49.     (progn (setq numints (xdge::getpropertyvalue gint "numintpoints"))
50.            (setq verts2  (xdrx_getpropertyvalue g2 "vertices")
51.                  verts1  (xdrx_getpropertyvalue g1 "vertices")
52.                  isnear  (< (xdge::getpropertyvalue g1 "distanceto" g2)
53.                             (xdrx_getvar "toldist")
54.                          )
55.                  isinnor (vl-some '(lambda (x) (xdrx_point_isinside x e2)) verts1)
56.            )
57.            (cond ((= numints 0)
58.                   (if isinnor
59.                     (progn (setq ret 0)
60.                            (if isnear
61.                              (setq ret 7)
62.                            )
63.                     )
64.                     (progn (setq ret 4)
65.                            (if isnear
66.                              (setq ret 8)
67.                            )
68.                     )
69.                   )
70.                  )
71.                  ((> numints 0)
72.                   (setq ints      (xdge::getpropertyvalue gint "intpoints")
73.                         cfgs      (mapcar '(lambda (x)
74.                                              (xdge::getpropertyvalue gint "getintconfigs" x t)
75.                                            )
76.                                           (xd::list:intarrays 0 (1- (length ints)))
77.                                   )
78.                         item      (xdrx_string_replace
79.                                     (substr (strcase (caar cfgs)) 2)
80.                                     "OVERLAP"
81.                                     ""
82.                                   )
83.                         cfgs1     (strcase (apply 'strcat (mapcar 'car cfgs)))
84.                         is-inters (and (xdrx_string_regexps "left" cfgs1)
85.                                        (xdrx_string_regexps "right" cfgs1)
86.                                   )
87.                         isqua     (and (> (length ints) 1)
88.                                        (or (not (xdrx_string_regexps "OVERLAP" cfgs1))
89.                                            (and (setq cfgs1 (xdrx_string_regexps item cfgs1))
90.                                                 (> (length cfgs1) 2)
91.                                            )
92.                                        )
93.                                   )
94.                         isMInters (> (length ints) 1)
95.                   )
96.                   (cond (is-inters (setq ret 2))
97.                         (isinnor
98.                          (setq ret 1)
99.                          (if (and isMInters isqua)
100.                            (setq ret 5)
101.                          )
102.                         )
103.                         (t
104.                          (setq ret 3)
105.                          (if (and isMInters isqua)
106.                            (setq ret 6)
107.                          )
108.                         )
109.                   )
110.                  )
111.            )
112.            (if (not isGe)
113.              (xdge::free g1 g2)
114.            )
115.            (xdge::free gint)
116.     )
117.   )
118.   ret
119. )
« Last Edit: December 05, 2023, 10:47:55 AM by xdcad »
The code I wrote uses XDRX-API，which can be downloaded from github.com and is updated at any time.
===================================