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.

xdcad

  • Swamp Rat
  • Posts: 527
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.
===================================
https://github.com/xdcad
https://sourceforge.net/projects/xdrx-api-zip/
http://bbs.xdcad.net