幅木断面を自動描画する
最近、実施設計が忙しく、展開図の幅木断面をいちいち描く気が失せまして、自動描画するツールを作ってみました。
動作の流れ
- 操作する線の始点と終点を取得し、交点を求める
- クリック座標を結んだ線と操作対象線の交点を求めることにより、幅木を描く方向を判定に使う
- 幅木高さ、チリの座標を求め幅木を描画
- 操作線の始点と終点のどちらを移動するか判定し、操作する線の端点を移動
パラメータの設定
プラグインコマンドは、ツールで新規作成し、コマンド編集で、スクリプトソースをコピペした後、パラメータを下記のように設定してください。この値は、モードバーで変更することができます。
名前 | フィールド名 | 型 | 初期値 |
---|---|---|---|
bbHeight | 幅木の高さ | Number | 45 |
bbThickness | 幅木のチリ | Number | 10 |
bbCrossPt | 交点に基準点を描画 | Boolean | True |
{*******************************************************************************
baseboardDraw
Copyright 2012 兵藤善紀建築設計事務所
www.hyodo-arch.com
2012.07.22 Ver 0.20 移動端点判定関数を追加
2012.07.21 Ver 0.10 コーディング開始
*******************************************************************************}
PROCEDURE baseboardDraw;
VAR
ClickPT1, ClickPT2, Lp1B, Lp1E, Lp2B, Lp2E,
LLintsec0, LLintsec1, LLintsec2, LLintsecH, LLintsecT, LLintsecHT
:POINT; {クリックした座標、線の始点と終点の座標}
hh1, hh2 :HANDLE; {処理する線}
bbCrossPt, parallel, IntOnLines
:BOOLEAN; {交点に基準点を描画するか?、LLIntSec で使用}
bbThickness, bbHeight, {幅木の厚さと高さ}
LL1, LL2 :REAL; {クリック座標と線の交点の距離}
{****************** 内積で移動端点を判定 ******************}
FUNCTION Pt1orPt2( aa : POINT ; bb : POINT):BOOLEAN;
VAR
cosTheta :REAL; {cosθの値}
BEGIN
cosTheta := (aa.x * bb.x + aa.y * bb.y)/(Sqrt(aa.x^2+aa.y^2) + Sqrt(bb.x^2+bb.y^2));
IF cosTheta < 0 THEN Pt1orPt2 := True ELSE Pt1orPt2 := False;
END;
{*******************************************************************************
メインプログラム部
*******************************************************************************}
BEGIN
GetLine(ClickPT1.x,ClickPT1.y,ClickPT2.x,ClickPT2.y);
hh1 := PickObject(ClickPT1.x, ClickPT1.y);
hh2 := PickObject(ClickPT2.x, ClickPT2.y);
{拾ったオブジェクトが両方「線」か?}
IF (GetTypeN(hh1)=2) & (GetTypeN(hh1)=2) THEN BEGIN
bbThickness := PBBTHICKNESS;
bbHeight := PBBHEIGHT;
bbCrossPt := PBBCROSSPT;
{線の始点と終点を取得し、交点を求める}
GetSegPt1(hh1, Lp1B.x, Lp1B.y);
GetSegPt2(hh1, Lp1E.x, Lp1E.y);
GetSegPt1(hh2, Lp2B.x, Lp2B.y);
GetSegPt2(hh2, Lp2E.x, Lp2E.y);
LineLineIntersection(Lp1B, Lp1E, Lp2B, Lp2E, parallel, IntOnLines, LLintsec0);
{クリック座標を結んだ線と操作対象線の交点を求めることにより、幅木を描く方向を判定に使う}
LineLineIntersection(Lp1B, Lp1E, ClickPT1, ClickPT2, parallel, IntOnLines, LLintsec1);
LineLineIntersection(Lp2B, Lp2E, ClickPT1, ClickPT2, parallel, IntOnLines, LLintsec2);
{幅木高さの座標}
LL1 := Distance(LLintsec0.x, LLintsec0.y, LLintsec1.x, LLintsec1.y);
LLintsecH.x := LLintsec0.x + (LLintsec1.x - LLintsec0.x) * bbHeight / LL1;
LLintsecH.y := LLintsec0.y + (LLintsec1.y - LLintsec0.y) * bbHeight / LL1;
{Locus(LLintsecH.x, LLintsecH.y);}
{幅木チリの座標}
LL2 := Distance(LLintsec0.x, LLintsec0.y, LLintsec2.x, LLintsec2.y);
LLintsecT.x := LLintsec0.x + (LLintsec2.x - LLintsec0.x) * bbThickness / LL2;
LLintsecT.y := LLintsec0.y + (LLintsec2.y - LLintsec0.y) * bbThickness / LL2;
{Locus(LLintsecT.x, LLintsecT.y);}
{幅木高さとチリの座標}
LLintsecHT.x := LLintsecT.x + (LLintsec1.x - LLintsec0.x) * bbHeight / LL1;
LLintsecHT.y := LLintsecT.y + (LLintsec1.y - LLintsec0.y) * bbHeight / LL1;
{Locus(LLintsecHT.x, LLintsecHT.y);}
{幅木を描画}
If bbCrossPt Then Locus(LLintsec0.x, LLintsec0.y);
MoveTo(LLintsecH.x, LLintsecH.y);
LineTo(LLintsecHT.x, LLintsecHT.y);
LineTo(LLintsecT.x, LLintsecT.y);
{端点の移動、Pt1orPt2ユーザ定義関数で、操作線の始点と終点のどちらの座標を移動するか判定する}
If Pt1orPt2(Lp1E-Lp1B, LLintsec2-LLintsec1)
Then SetSegPt1(hh1, LLintsecH.x, LLintsecH.y)
Else SetSegPt2(hh1, LLintsecH.x, LLintsecH.y);
If Pt1orPt2(Lp2E-Lp2B, LLintsec1-LLintsec2)
Then SetSegPt1(hh2, LLintsecT.x, LLintsecT.y)
Else SetSegPt2(hh2, LLintsecT.x, LLintsecT.y);
END;
END;
RUN ( baseboardDraw );