大家好
我试图编写一个vba例程,该例程允许我通过指定三个点来获得多段线形状的起始宽度和长度。多段线通常由正交直线组成(但并不总是如此)
点1和2是第一条边的起点和终点,从中可以得到第一条边的起始宽度和角度。点3是另一侧的任意点。间隔的长度是点3和第一条边(连接点1和2的线)之间的垂直距离。
我已经使用vlax curve getClosestPointTo编写了一个(粗糙的)LISP例程,但现在我想编写一个vba例程来实现同样的功能。
例行程序的目的是协助制作预制楼板布置图。多段线形状将是建筑图形中的间隔;宽度将提供预制梁的长度;长度将提供填充地板的长度。
有谁能帮我或给我指出正确的方向吗?
非常感谢
- ;; dtr - degrees to radians
- ;; rtd - radians to degrees
- (defun dtr (a)
- (* pi (/ a 180.0))
- )
- (defun rtd (a)
- (/ (* a 180.0 pi))
- )
- (defun C:bay (/ pt1 pt2 pt3 pt4)
- (setq OrigCmdEcho (getvar "CMDECHO")); gets CMDECHO value
- (setvar "CMDECHO" 0); sets to 0 - wont echo on command line
- (vl-load-com)
- (setq pt1 (getpoint "\Enter Point 1 : "))
- (setq pt2 (getpoint pt1 "\nEnter point 2 : "))
- (setq myline (command "_line" pt1 pt2 ""));draws 1st line
- (setq mylinename (entlast));obtain entity name of myline
- (setq pt3 (getpoint pt2 "\nEnter Point 3 : ")); get point on opposite side of rectangle
- (setq Span (distance pt1 pt2)); sets Span = length of myline
- (setq ang1 (angle pt1 pt2)); sets ang1 equal to line angle
- (setq mylinenamevla (vlax-ename->vla-object mylinename)); converts to vla object
- (setq pt4 (vlax-curve-getClosestPointTo mylinenamevla pt3 T)); gets perpendicular point
- (setq perpline (command "_line" pt3 pt4 "")); draws perpendicular line
- (setq perplinename (entlast));obtain entity name of perpline
- (setq bayl (distance pt3 pt4)); sets bay length to length of perpline
- (princ "\nSpan is : ")(princ Span)
- (princ "\nBay length is : ")(princ bayl)
- (command "_erase" mylinename "")
- (command "_erase" perplinename "")
- (setvar "CMDECHO" OrigCmdEcho); puts back to original value
- (princ)
- )
|