幅木断面を自動描画する

最近、実施設計が忙しく、展開図の幅木断面をいちいち描く気が失せまして、自動描画するツールを作ってみました。

動作の流れ

  1. 操作する線の始点と終点を取得し、交点を求める
  2. クリック座標を結んだ線と操作対象線の交点を求めることにより、幅木を描く方向を判定に使う
  3. 幅木高さ、チリの座標を求め幅木を描画
  4. 操作線の始点と終点のどちらを移動するか判定し、操作する線の端点を移動

パラメータの設定

プラグインコマンドは、ツールで新規作成し、コマンド編集で、スクリプトソースをコピペした後、パラメータを下記のように設定してください。この値は、モードバーで変更することができます。

名前フィールド名初期値
bbHeight幅木の高さNumber45
bbThickness幅木のチリNumber10
bbCrossPt交点に基準点を描画BooleanTrue

{*******************************************************************************
                    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 );