求助怎么快速生成矩形的黄金分割线?
求助怎么快速生成矩形横向和纵向的黄金分割线?;; 实体黄金分割线
距离的(√5-1)/2 xyp1964 发表于 2024-12-31 11:48
;; 实体黄金分割线
很好→很棒!很好~很棒!! xyp1964 发表于 2024-12-31 11:48
;; 实体黄金分割线
院长我找到你多年以前的代码
;;;黄金比 : hjb
(defun c:hjb ()
(setqpt1 (getpoint "\n起点 :")
no6 (getreal "\n短边长 : ")
leng (/ (- (sqrt 5) 1) 2);黄金比长边尺寸
pt2 (list (+ (car pt1) no6) (+ (cadr pt1) (* no6 leng)))
)
(command "rectang" pt1 pt2);黄金比的长方形
) 月下闲人 发表于 2025-1-1 23:41
院长我找到你多年以前的代码
;;;黄金比 : hjb
(defun c:hjb ()
(defun c:tt ()
"黄金比矩形"
(setq dd (Udist 7 "" "短边长<输入或鼠标直接量取>" dd nil)
sc (/ (- (sqrt 5) 1) 2.) ;黄金比
)
(while (setq p1 (getpoint "\n起点<退出>: "))
(setq p2 (list (+ (car p1) dd) (+ (cadr p1) (* dd sc)))
s1(command "rectang" "non" p1 "non" p2)
)
)
(princ)
) xyp1964 发表于 2025-1-2 13:08
再次感谢很好用 本帖最后由 月下闲人 于 2025-3-8 11:36 编辑
xyp1964 发表于 2024-12-31 11:48
;; 实体黄金分割线
院长好麻烦帮我看看哪里不对谢谢了
(defun c:HJJ (/ *acad* *doc* ss i ent obj result minPt maxPt width height hSplitY vSplitX)
(vl-load-com)
(setq *acad* (vlax-get-acad-object))
(setq *doc* (vla-get-activedocument *acad*))
;; 创建或获取黄金分割线图层
(if (not (tblsearch "LAYER" "HJX-黄金线"))
(vla-add (vla-get-layers *doc*) "HJX-黄金线")
)
(vla-put-color (vla-item (vla-get-layers *doc*) "HJX-黄金线") 1)
(vla-put-linetype (vla-item (vla-get-layers *doc*) "HJX-黄金线") "Continuous")
;; 用户交互
(prompt "\n请选择对象: ")
(if (setq ss (ssget '((0 . "CIRCLE,ELLIPSE,LWPOLYLINE,POLYLINE,SPLINE,INSERT,HATCH"))))
(progn
(repeat (setq i (sslength ss))
(setq ent (ssname ss (setq i (1- i)))
obj (vlax-ename->vla-object ent))
;; 安全获取边界框
(setq result (vl-catch-all-apply 'vla-getboundingbox (list obj 'minPt 'maxPt)))
(if (vl-catch-all-error-p result))
(princ "\n错误: 无法获取对象的边界框。")
(progn
;; 转换坐标数据
(setq minPt (vlax-safearray->list (vlax-variant-value minPt)))
(setq maxPt (vlax-safearray->list (vlax-variant-value maxPt)))
;; 计算尺寸
(setq width (- (car maxPt) (car minPt))
height (- (cadr maxPt) (cadr minPt)))
)
;; 有效性检查
(if (and (> width 1e-6) (> height 1e-6)); 避免浮点误差
(progn
;; 计算黄金分割点
(setq hSplitY (+ (cadr minPt) (* height 0.618))
(setq vSplitX (+ (car minPt) (* width 0.618)))
;; 创建分割线
(entmakex (list '(0 . "LINE")
'(8 . "HJX-黄金线")
(cons 10 (list (car minPt) hSplitY 0.0))
(cons 11 (list (car maxPt) hSplitY 0.0))
)
(entmakex (list '(0 . "LINE")
'(8 . "HJX-黄金线")
(cons 10 (list vSplitX (cadr minPt) 0.0))
(cons 11 (list vSplitX (cadr maxPt) 0.0))
)
)
(princ "\n警告: 对象尺寸过小或无效,已跳过。")
)
)
)
)
)
(princ "\n未选择有效对象。"))
(princ)
)
月下闲人 发表于 2025-3-8 11:35
院长好麻烦帮我看看哪里不对谢谢了
(defun c:HJJ (/ *acad* *doc* ss i ent obj result minPt max ...
(defun c:tt ()
(setq *doc* (vla-get-activedocument (vlax-get-acad-object)))
(vla-add (vla-get-layers *doc*) "HJX-黄金线")
(vla-put-color(vla-item (vla-get-layers *doc*)"HJX-黄金线")1)
(vla-put-linetype(vla-item (vla-get-layers *doc*)"HJX-黄金线")"Continuous")
(prompt "\n请选择对象: ")
(if (setq ss (ssget '((0 . "CIR*,ELL*,*LINE,INSERT,HATCH"))))
(repeat (setq i (sslength ss))
(setq ent (ssname ss (setq i (1- i)))
obj (vlax-ename->vla-object ent)
)
(vla-getboundingbox (vlax-ename->vla-object ent) 'p1 'p9)
(setq a(mapcar 'vlax-safearray->list (list p1 p9))
p1 (car a)
p9 (cadr a)
yy (+ (cadr p1) (* (- (cadr p9) (cadr p1)) 0.618))
xx (+ (car p1) (* (- (car p9) (car p1)) 0.618))
)
(entmakex (list '(0 . "LINE")
'(8 . "HJX-黄金线")
(cons 10 (list (car p1) yy))
(cons 11 (list (car p9) yy))
)
)
(entmakex (list '(0 . "LINE")
'(8 . "HJX-黄金线")
(cons 10 (list xx (cadr p1)))
(cons 11 (list xx (cadr p9)))
)
)
)
)
(princ)
) xyp1964 发表于 2025-3-8 16:35
简洁又强大非常棒感谢院长赐教
页:
[1]
2