AutoLISP (AutoCAD 2015 で使用) を使用して、特定の画層に配置されたすべての長方形の全長を計算するスクリプトに取り組んでいます。
(具体的な目的: 木製の床を支えるための木製の梁を表す複数の長方形を含むレイヤーがあります。この床のために何メートルの梁を購入する必要があるかを計算したいと考えています。)
これまでのところ、レイヤー上のすべての線の長さの合計を計算するスクリプトがあります。これはこれまでのところうまくいきます。レイヤー上のすべての長方形の (円周) 線の全長と、見つかった長方形の数の両方を返します。
(defun C:PLINELEN (/ ent sset obj len sum layer a)
(setvar "ERRNO" 0)
(while
(and (not (setq ent (car (entsel "Select object on layer: "))))
(/= (getvar "ERRNO") 52)
)
)
(cond ((and ent
(setq sset
(ssget
"X"
(list '(0 . "LWPOLYLINE")
(cons 8 (setq layer (cdr (assoc 8 (entget ent)))))
)
)
)
)
(setq a 0
sum 0
)
(repeat (sslength sset)
(setq obj (vlax-ename->vla-object (ssname sset a))
len (vlax-curve-getDistAtParam
obj
(- (vlax-curve-getEndParam obj)
(vlax-curve-getStartParam obj)
)
)
sum (+ sum len)
)
(setq a (1+ a))
)
(princ (strcat "\nTotal length of "
(itoa a)
(if (= a 1)
" pline on layer "
" plines on layer "
)
layer
": "
(rtos sum)
)
)
)
(T (princ "\nNo plines found"))
)
(princ)
)
まだ欠けているのは、長方形のすべての短辺を脇に置き、長辺のみを合計する機能です。
私の理解では、最も簡単な解決策は次のとおりです。レイヤーで見つかった長方形のすべての短辺の長さの合計を決定する機能を追加し、それを「合計」から減算します)
擬似コード:
(iterate through all rectangles on the layer
(measure all four sides of the rectangle)
(compare the four measurements and store [one of the] shortest into variable x)
(sumOfShortSides = sumOfShortSides + x)
)
私はほとんどそこにいますが、既存のコードを改善して短い側面を削除するためのポインターが必要です。他のソリューションも大歓迎です。
レイヤー内のすべての長方形の長辺を合計するにはどうすればよいですか?