teknomatika 发表于 2022-7-6 09:13:20

确定特定Z值i

必要性和挑战:
他需要一个例程,您可以选择一条具有不同Z值的线,并沿其长度确定示例中Z的特定值,即值10。应使用点及其注释值Z进行标记。
以一条线为例,但理想的情况是,该检查可以在一组线中同时发生。

Lee Mac 发表于 2022-7-6 09:21:32

在伪代码中:
 
[列表]
[*]获取行实体
[*]获取起点/终点
[*]计算点之间的Z差
[*]计算点之间的2D距离(现在有了渐变)
[*]使用Z=gd(g=梯度,d=2D距离)计算具有指定Z值的点的距离。
[/列表]

David Bethel 发表于 2022-7-6 09:26:33

命令:ID
 
???

teknomatika 发表于 2022-7-6 09:27:14

李,这是一个很好的指导方针。
我的知识是基础的。不知道我是否可以。
用另一种方式描述它,我想要的是在调查工作中得到等高线的效果。指定特定的Z坐标,例程必须能够查看每条线。同时,您必须通过引入点实体及其符号Z坐标文本在每条线上标记该点。

Lee Mac 发表于 2022-7-6 09:31:59

这是一个非常详细的例子,我指出的路线-我使用了长变量名和逐步变量分配,以便您可以看到我使用的方法。
 
以下是一个测试函数示例:

(defun c:test ( / e p z )
(if
   (and
   (setq e (car (entsel "\nSelect Line: ")))
   (eq "LINE" (cdr (assoc 0 (entget e))))
   (setq z (getreal "\nSpecify Z-Value: "))
   (setq p (PointonLine e z))
   )
   (entmakex (list (cons 0 "POINT") (cons 10 p)))
)
(princ)
)

BlackBox 发表于 2022-7-6 09:40:38

李的代码要简洁得多,但我想到的是(另一个ActiveX示例-LoL):
 

(defun c:FOO ( / *error* oldNomutt ss elev acDoc startElev endElev lp hp flag len space)
(vl-load-com)

(defun *error*(msg)
   (and oldNomutt (setvar 'nomutt oldNomutt))
   (vla-endundomark acDoc)
   (cond ((not msg))                                                   ; Normal exit
         ((member msg '("Function cancelled" "quit / exit abort")))    ; <esc> or (quit)
         ((princ (strcat "\n** Error: " msg " ** "))))               ; Fatal error, display it
   (princ))

(prompt "\nSelect 3D polylines to mark elevation: ")
(and (setq oldNomutt (getvar 'nomutt)) (setvar 'nomutt 1))
(if (and (setq ss (ssget "_:L" '((0 . "POLYLINE"))))
          (setvar 'nomutt oldNomutt)
          (setq elev (getreal "\nEnter elevation: ")))
   (progn
   (vla-startundomark
       (setq acDoc (vla-get-activedocument (vlax-get-acad-object))))
   (vlax-for x(setq ss (vla-get-activeselectionset acDoc))
       (setq startElev (last (vlax-curve-getstartpoint x)))
       (setq endElev (last (vlax-curve-getendpoint x)))
       (cond ((< startElev endElev)
            (setq lp startElev)
            (setq hp endElev)
            (setq flag T))
             ((> startElev endElev)
            (setq lp endElev)
            (setq hp startElev))
             ((= startElev endElev)
            (prompt "\n** Flat polylines not accepted ** ")
            (redraw (vlax-vla-object->ename x) 3)
            (quit)))
       (setq len (vla-get-length x))
       (vla-put-color
         (vla-addpoint
         (cond (space)
               ((setq space (vla-get-modelspace acDoc))))
         (vlax-3d-point
             (cond (flag
                  (vlax-curve-getpointatdist
                      x
                      (/ (- elev lp)
                         (/ (abs (- hp lp)) len))))
                   ((vlax-curve-getpointatdist
                      x
                      (- len
                         (/ (- elev lp)
                            (/ (abs (- hp lp)) len))))))))
         acred))
   (vla-endundomark acDoc)
   (vla-delete ss))
   (cond (ss (prompt "\n** Invalid input: No elevation ** "))
         ((prompt "\n** No 3D polylines selected ** "))))
(princ))

teknomatika 发表于 2022-7-6 09:43:09

李麦克:
杰出的这是正确的。只剩下集成配额值Z的注释文本。
此外,对于多段线和三维多段线,也可以接受相同的过程。
 
RenderMan:
您的版本无效。当然,因为失败是目前不理解的事情。

BlackBox 发表于 2022-7-6 09:49:57

 
当我选择三维多段线时,它在我的一端工作得很好。英雄联盟
 
(PDMODE=3时显示的结构)

Tharwat 发表于 2022-7-6 09:50:43

 
可能是因为RenderMan将直线视为多段线!!

BlackBox 发表于 2022-7-6 09:55:34

 
这是正确的。。。这两条线和LWpolyline都没有坡度。
 
如果没有三维多段线,起点和终点之间的高程差如何?
 
... 除非立面图纯粹是注释?在这种情况下,我完全误解了OP.LoL
页: [1] 2
查看完整版本: 确定特定Z值i