|
【Jw_cad 外部変形】読み込みデータの生成(5) |
レイヤや線属性等についての生成は前回に述べましたので、今回はその他の要素データの生成について記述します。
◇線データ
既に述べましたように
線データ(始点x1,y1 終点x2,y2)
書式:x1 y1 x2 y2 |
です。その他に連続線データや極座標等もありますがそれについては線データで代用可能ですので記述しません。
◇曲線データ
「pl」 |
曲線データ
書式:pl
x1 y1 x2 y2
x2 y2 x3 y3
x3 y3 x4 y4
# |
ここで注意しないといけないのは、書き出しデータ「JWC_TEMP.TXT」を読み取った段階では、
|
pl
z1
xxx xxx xxx xxx
xxx xxx xxx xxx
z2
xxx xxx xxx xxx
xxx xxx xxx xxx
# |
|
のように線データと線データの間に属性等が指定されていても、読み込みデータの生成を行う際には、こういった指定方法をすると、曲線データとはならずバラバラになってしまいます。生成データを作成する際には注意して下さい。
◇属性データ
「z4」 |
建具属性(包絡処理対象外の指定)
書式:z4 |
「z5」 |
建具属性(包絡処理対象 の指定)
書式:z5 |
要素データ1つ1つの直前に生成して下さい。
のように連続で指定する事が出来ますが、「z4」と「z5」を同時に指定する事は出来ません。「z5」が優先されます。
◇点データ
「pt」 |
点データ
書式:pt x y
x,y:配置座標 |
「pt」 |
点マーカデータ
書式:pt x y bai ang cod
x,y:配置座標
bai:倍率(標準 1)
ang:角度[°]
cod:マーカコード
マーカーコード
1:blancked arrow 2:blancked box
3:blancked dot 4:dimension origin
5:filled box 6:filled arrow
7:filled dot 8:integral symbol
9:Open Arrow 10:slash
11:unfilled arrow
-1:asterisk -2:circle -3:dot -4:plus
-5:square -6:triangle -7:X |
点データ、点マーカデータです。色は「lc」ではなく「pn」で指定します。
◇円データ
「ci」 |
円データ
書式:ci x y r
x,y:中心座標
r:半径 |
◇弧・楕円データ
「ci」 |
弧・楕円データ
書式:ci x y r sa ea h ka
x,y:中心座標
r:半径
sa:開始角度[°]
ea:終了角度[°]
h:偏平率
ka:傾き角度[°] |
◇文字列データ
「ch」 |
横文字
書式:ch x1 y1 x2 y2 "文字列
x1,y1:基準点座標
x2,y2:文字作図方向を示す座標
"文字列:作図する文字内容 |
縦文字、寸法値・・・は、横文字と同じ書式です。
◇寸法図形データ
「msg」 |
寸法図形データ
書式:msg
x1 y1 x2 y2
cs x1 y1 x2 y2 "寸法値 |
「msg」と線データの間に「lc」「lt」「lw」を挿入する事は可能です。線データと寸法値データの間に「cn」を挿入する事は可能です。しかし「lg」「ly」「cc」を入れる事は出来ません(無視されます)。線データと寸法値データを別レイヤにするという事は出来ませんので注意して下さい。レイヤの指定は「msg」の直前で行って下さい。線データの「lc」「lt」「lw」については、「msg」の前でも後でも良いようですが、書き出しデータ「JWC_TEMP.TXT」では「msg」の後になるようです。
◇ソリッド図形データ
「lc」 |
線色設定
書式:lc○
線色○で作図します
書式:lc10 col
任意色 col で作図します
col:赤(0〜255)+緑(0〜255)×256+青(0〜255)×65536 |
「sl」 |
線形ソリッド図形
書式:sl x1 y1 x2 y2
x1,y1:開始点座標
x2,y2:終了点座標
三角形ソリッド図形
書式:sl x1 y1 x2 y2 x3 y3
x1,y1:第1点座標
x2,y2:第2点座標
x3,y3:第3点座標
第1点→第2点→第3点
→第1点と結びます
四角形ソリッド図形
書式:sl x1 y1 x2 y2 x3 y3 x4 y4
x1,y1:第1点座標
x2,y2:第2点座標
x3,y3:第3点座標
x4,y4:第4点座標
第1点→第2点→第3点→第4点
→第1点と結びます |
「sc」 |
円ソリッド図形
書式:sc x y r h ka sa da flag
x,y:中心点座標
r :半径
h :偏平率(円状態は「1」)
ka :傾き角度[rad]
sa :開始角度[rad]
da :円弧角度[rad]
flag:円「100」、弓形「5」
扇形「0」、円外側「-1」 |
「se」 |
円周ソリッド図形
書式:se x y r h ka sa da flag
x,y:中心点座標
r :半径
h :偏平率(円状態は「1」)
ka :傾き角度[rad]
sa :開始角度[rad]
da :円弧角度[rad]
flag:円「100」、円弧「0」 |
「so」 |
円環ソリッド図形(同一扁平率タイプ)
書式:so x y r h ka sa da ri
x,y:中心点座標
r :半径
h :偏平率(円状態は「1」)
ka :傾き角度[rad]
sa :開始角度[rad]
da :円弧角度[rad]
ri :内円半径 |
「sg」 |
円環ソリッド図形(同一幅タイプ)
書式:sg x y r h ka sa da ri
x,y:中心点座標
r :半径
h :偏平率(円状態は「1」)
ka :傾き角度[rad]
sa :開始角度[rad]
da :円弧角度[rad]
ri :内円半径 |
弧・楕円データとは異なっていますので注意する必要があります。関数・手続きでの引数は[°]にして内部で /180*Pi を掛けて[rad]に変換しても良いのですが、ここでは敢えてオリジナル状態の[rad]でやりとりするようにします。
◇確認作業
上記の動作確認については、メモ帳を起動させて直接入力を行ってみると出来ると思います。
上記の実装作業を行いますが、テストプログラムとして、選択した要素データの分割点を作図する外部変形プログラムを作ってみます。対象は取りあえず、線、円、弧とします。円、弧の分割は角度に対しての分割とします。
まずはバッチファイルから。
|
p033_分割点.bat |
REM p033−分割点
@echo off
REM #jww
REM #cd
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #bz
REM #gn
REM #h1
REM #hc 範囲選択をして下さい。
REM #g1
REM #hr
start /w p033.exe |
|
プロジェクト「p033」の準備を行います。「C:\DelphiProgram\jww」フォルダの中に「p033」というフォルダを作成し、Delphi6を起動します。メニュー「プロジェクト」→「オプション」を実行し、下記の設定を行います。
[アプリケーション]頁
タイトル | p033−分割点 |
[ディレクトリ/条件]頁
パス及びディレクトリ | C:\DelphiProgram\jww\p033 |
メニュー「ファイル」→「名前を付けて保存」
「C:\DelphiProgram\jww\p033」の中に「Unit1.pas」を保存
メニュー「ファイル」→「プロジェクトに名前を付けて保存」
「C:\DelphiProgram\jww\p033」の中に「p033.dpr」として保存
◆
Form1の画面は、取りあえずいつもと同じく、大きさを扱いやすいよう小さくし、オブジェクトインスペクタで Form1 のプロパティを設定します。
BorderIcons
biMaximize | False | 最大化しないように |
BorderStyle | bsSingle | 画面をリサイズしないように |
Caption | 分割点 | タイトルバーに表示されます |
Color | clSkyBlue | お好みでどうぞ |
Font内
Name | MS ゴシック |
プロポーショナルフォントは
文字配置調整が微妙なので |
Font内
Size | 10 | 小さいと少し見難い為 |
Scaled | False |
動作環境によっての文字の
大きさ変動を少し抑えられる |
メニュー「表示」→「プロジェクトマネージャ」
を実行し、コード画面の左側にドッキングさせておきます。
前回作成した「MyFunc.pas」を取り込んでみます。
メニュー「ファイル」→「開く」
「C:\DelphiProgram\jww\p032」の中の「MyFunc.pas」を指定すると、コード画面に MyFunc 内容が表示されます。この状態で
メニュー「ファイル」→「名前を付けて保存」
「C:\DelphiProgram\jww\p033」の中に「MyFunc.pas」のまま保存
メニュー「プロジェクト」→「プロジェクトに追加」
を行い「C:\DelphiProgram\jww\p033」の中の「MyFunc.pas」を指定します。すると、コード画面左側のプロジェクトマネージャに「MyFunc.pas」が追加されます。
「JwwGaibu.pas」についても同様に行います。
Unit1.pas の uses節に MyFunc と JwwGaibu を追加します。(※以下では全角空白を付けて桁調整等をしていますが実際は半角空白或いは無しです)
|
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,
MyFunc, JwwGaibu ;
type
TForm1 = class(TForm)
・・・ |
|
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
アイコンが Delphi6デフォルトのものになっていますので、メニュー「ツール」→「イメージエディタ」を実行し、そのメニュー「ファイル」→「新規作成」→「アイコンファイル」を実行し、16×16・16色のアイコンを作成します。(32×32でも構いませんし他のツールで作成するのでも構いません)「C:\DelphiProgram\jww\p033」の中に「Icon1.ico」として保存します。保存できたらイメージエディタを終了します。
メニュー「プロジェクト」→「オプション」を実行し、
[アプリケーション]頁の中の[アイコンの読み込み]ボタンをクリックし、「C:\DelphiProgram\jww\p033\Icon1.ico」を指定します。[OK]ボタンをクリックしてプロジェクトオプション画面を閉じます。
オブジェクトインスペクタにて、Form1 の Icon プロパティの入力欄右端の[…]をクリックして、[読み込み]ボタンをクリックし、「Icon1」を指定して、[OK]ボタンをクリックします。
◆
オブジェクトインスペクタにて Form1 の イベント OnShowの箇所でダブルクリック、OnCloseの箇所でダブルクリックし、取りあえず下記のように追記します。
|
Unit1.pas |
(・・・前略・・・)
type
TForm1 = class(TForm)
(・・・)
private
{ Private 宣言 }
AppPath : string ;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// 起動時
procedure TForm1.FormShow(Sender: TObject);
begin
Form1.Left := Mouse.CursorPos.X - Form1.Width div 2;
Form1.Top := Mouse.CursorPos.Y - Form1.Height div 2;
// 初期設定
InitJwwGaibu ;
// プログラムのあるフォルダを取得します
AppPath := ExtractFilePath(Application.ExeName) ;
// JWC_TEMP.TXTを開きます
OpenTempFile(AppPath+'JWC_TEMP.TXT') ;
// 初期設定
S_Init ;
end;
// 終了時
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// JWC_TEMP.TXTを保存します
SaveTempFile(AppPath+'JWC_TEMP.TXT') ;
// 最終処理
EndJwwGaibu ;
end;
end. |
|
画面上に [Standard]内の Label を1つ配置し、Captionプロパティを「分割数」とします。Edit を1つ配置し、オブジェクトインスペクタでプロパティを以下のように変更します。
|
ImeMode | imDisable | 全角入力出来ないように |
Text | (空状態) | 最初は何も入力していない状態に |
|
Button プロパティを2つ配置し、それぞれ以下のようにプロパティを指定します。
|
Button1
Caption | OK(&Y) | ボタン上の文字 |
Default | True | [Enter]キーを押したら[OK] |
Button2
Caption | キャンセル(&N) | ボタン上の文字 |
Cancel | True | [Esc]キーを押したら[キャンセル] |
|
画面のレイアウトは下図のようにしてみました。
Button1、Button2をダブルクリックして OnClickイベントを記述出来るようにします。取りあえず・・・
|
Unit1.pas |
(・・・前略・・・)
// [OK]
procedure TForm1.Button1Click(Sender: TObject);
var
n : integer ;
begin
n := SInt(Edit1.Text) ;
if (n < 2)or(n > 10000) then exit;
Close ;
end;
// [Cancel]
procedure TForm1.Button2Click(Sender: TObject);
begin
Close ;
end;
end. |
|
◇属性データ
それではまず属性の生成から。overload指定をして同じ名前の手続きで3パターンでの書き方が出来るようにしておきます。
|
JwwGaibu.pas |
(・・・前略・・・)
procedure S_SColRGB(r,g,b:integer);
procedure S_Attr(att:integer); overload ;
procedure S_Attr(at1,at2,at3,at4,at5:Boolean); overload ;
procedure S_Attr(at1,at2,at3,at4,at5:integer); overload ;
//
procedure S_Line(x1,y1,x2,y2:double);
(・・・中略・・・)
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 書き込みフラグ属性を指定
// att : フラグ属性
// +1:ハッチ +2:図形 +4:寸法 +8:建具(包絡対象外) +16:建具(包絡対象)
// +8,+16同時指定の場合は +16のみ
procedure S_Attr(att:integer); overload ;
begin
if ((att and 1) > 0) then
SendMem('z1');
if ((att and 2) > 0) then
SendMem('z2');
if ((att and 4) > 0) then
SendMem('z3');
if ((att and 8) > 0)and((att and 16) = 0) then
SendMem('z4');
if ((att and 16) > 0) then
SendMem('z5');
end;
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 書き込みフラグ属性を指定
// at1 : ハッチ属性(True:on False:off)
// at2 : 図形属性 (True:on False:off)
// at3 : 寸法属性 (True:on False:off)
// at4 : 建具属性(包絡対象外)(True:on False:off)
// at5 : 建具属性(包絡対象) (True:on False:off)
// at4,at5同時指定の場合は at5のみ
procedure S_Attr(at1,at2,at3,at4,at5:Boolean); overload ;
begin
if (at1) then
SendMem('z1');
if (at2) then
SendMem('z2');
if (at3) then
SendMem('z3');
if (at4)and(at5 = False) then
SendMem('z4');
if (at5) then
SendMem('z5');
end;
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 書き込みフラグ属性を指定
// at1 : ハッチ属性(1:on 0:off)
// at2 : 図形属性 (1:on 0:off)
// at3 : 寸法属性 (1:on 0:off)
// at4 : 建具属性(包絡対象外)(1:on 0:off)
// at5 : 建具属性(包絡対象) (1:on 0:off)
// at4,at5同時指定の場合は at5のみ
procedure S_Attr(at1,at2,at3,at4,at5:integer); overload ;
begin
if (at1 <> 0) then
SendMem('z1');
if (at2 <> 0) then
SendMem('z2');
if (at3 <> 0) then
SendMem('z3');
if (at4 <> 0)and(at5 = 0) then
SendMem('z4');
if (at5 <> 0) then
SendMem('z5');
end;
(・・・後略・・・) |
|
◇曲線データ
曲線データは別段連続線状態になっていなくても構いません。複数の線データを1つの曲線データとしてまとめる事が出来ます。但し、全て同じレイヤグループ・レイヤ・線色・線種・線幅・フラグ属性でなければなりません。線データの個数は変動します。ここでは、「pl」を生成する手続き S_PLineStartと「#」を生成する手続き S_PLineEnd、中身は S_Line をそのまま利用してもらう、という手法と、動的配列を使用する手法の双方を用意します。
|
JwwGaibu.pas |
(・・・前略・・・)
type
(・・・)
TJwwPLine = record // 曲線データ生成用
x1 : double ; // 第1点X
y1 : double ; // 第1点Y
x2 : double ; // 第2点X
y2 : double ; // 第2点Y
end;
var
(・・・)
// 「JWC_TEMP.TXT」生成用メモリ
JT_MemN : integer ;
JT_Mem : array of string ;
JT_PLineN : integer ;
JT_PLine : array of TJwwPLine ;
(・・・)
//
procedure S_Line(x1,y1,x2,y2:double);
procedure S_PLineStart ;
procedure S_PLineEnd ;
procedure S_PLine ;
procedure S_PLineReset;
procedure S_PLineSet(x1,y1,x2,y2:double);
(・・・)
procedure InitJwwGaibu ;
(・・・)
//
JT_MemN := 0;
JT_Mem := nil;
JT_PLineN:= 0;
JT_PLine := nil;
end;
procedure EndJwwGaibu ;
(・・・)
//
JT_Mem := nil;
JT_PLine := nil;
end;
(・・・)
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 曲線データの開始
// この後に S_Line で線分の作図を行って下さい
// 最後に、S_PLineEnd を行って下さい
procedure S_PLineStart ;
begin
SendMem('pl');
end;
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 曲線データの終了
procedure S_PLineEnd ;
begin
SendMem('#');
end;
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 曲線データの作図
// 各線は、JT_PLineN に線分数を入れ
// 動的配列 JT_PLine のメモリ確保を行って
// データを入れておいて下さい
procedure S_PLine ;
var
i : integer ;
begin
if (JT_PLineN <= 0) then exit ;
if (JT_PLineN = 1) then begin
with JT_PLine[0] do
S_Line(x1,y1,x2,y2);
end
else begin
SendMem('pl');
for i:=0 to JT_PLineN-1 do begin
with JT_PLine[i] do
S_Line(x1,y1,x2,y2);
end;
SendMem('#');
end;
end;
// 曲線データ作図用メモリのリセット
procedure S_PLineReset;
begin
JT_PLineN := 0;
JT_PLine := nil;
end;
// 曲線データ作図用メモリのセット
// 最初は S_PLineReset を行って下さい
// セットが終わったら S_PLine を行って下さい
procedure S_PLineSet(px1,py1,px2,py2:double);
begin
Inc(JT_PLineN);
SetLength(JT_PLine, JT_PLineN);
with JT_PLine[JT_PLineN-1] do begin
x1 := px1; y1 := py1;
x2 := px2; y2 := py2;
end;
end;
end. |
|
◇点データ
「pn」については既に作成していますので「pt」を作成する手続きを2つ作成します。
|
JwwGaibu.pas |
(・・・前略・・・)
procedure S_PLineSet(x1,y1,x2,y2:double);
procedure S_Ten(x,y:double);
procedure S_Mark(x,y,bai,ang:double;cod:integer);
(・・・中略・・・)
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 点の作図
// x,y : 配置点
procedure S_Ten(x,y:double);
var
s : string ;
begin
s := 'pt '
+ FloatToStr(x) + ' '
+ FloatToStr(y) ;
SendMem(s);
end;
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 点マーカの作図
// x,y : 配置点
// bai : 倍率(標準 1)
// ang : 角度[°]
// cod : マーカコード
// 1:blancked arrow 2:blancked box
// 3:blancked dot 4:dimension origin
// 5:filled box 6:filled arrow
// 7:filled dot 8:integral symbol
// 9:Open Arrow 10:slash
// 11:unfilled arrow
// -1:asterisk -2:circle -3:dot -4:plus
// -5:square -6:triangle -7:X
procedure S_Mark(x,y,bai,ang:double;cod:integer);
var
i : integer ;
b : double ;
s : string ;
begin
i := cod ;
if (i < -7)or(i > 11) then i := -3;
b := bai ;
if (Abs(b) <= _LIMIT) then b := 1.0;
s := 'pt '
+ FloatToStr(x) + ' '
+ FloatToStr(y) + ' '
+ FloatToStr(b) + ' '
+ FloatToStr(ang) + ' '
+ IntToStr(i) ;
SendMem(s);
end;
end. |
|
◇円データ
|
JwwGaibu.pas |
(・・・前略・・・)
procedure S_Mark(x,y,bai,ang:double;cod:integer);
procedure S_Circle(x,y,r:double);
(・・・中略・・・)
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 円の作図
// x,y:中心座標
// r:半径
procedure S_Circle(x,y,r:double);
var
s : string ;
begin
if (r <= _LIMIT) then exit ;
s := 'ci '
+ FloatToStr(x) + ' '
+ FloatToStr(y) + ' '
+ FloatToStr(r) ;
SendMem(s);
end;
end. |
|
◇弧・楕円データ
|
JwwGaibu.pas |
(・・・前略・・・)
procedure S_Circle(x,y,r:double);
procedure S_Arc(x,y,r,sa,ea,h,ka:double);
(・・・中略・・・)
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 弧・楕円の作図
// x,y:中心座標
// r :半径
// sa:開始角度[°]
// ea:終了角度[°]
// h :偏平率
// ka:傾き角度[°]
procedure S_Arc(x,y,r,sa,ea,h,ka:double);
var
s : string ;
begin
if (r <= _LIMIT) then exit ;
if (Abs(h) <= _LIMIT) then exit ;
s := 'ci '
+ FloatToStr(x) + ' '
+ FloatToStr(y) + ' '
+ FloatToStr(r) + ' '
+ FloatToStr(sa) + ' '
+ FloatToStr(ea) + ' '
+ FloatToStr(h) + ' '
+ FloatToStr(ka) ;
SendMem(s);
end;
end. |
|
◇文字列データ
横文字・縦文字・寸法値・半径寸法値・直径寸法値・角度寸法値・累進寸法値・日影 真北・日影 建物高さ・2.5D はコード化して1つの手続きで行う事とします。文字列の内容が空の場合や空白のみの場合は生成をキャンセルさせます。そのため空白文字を取り除く関数 KTrimをMyFunc.pasに作成します。
|
JwwGaibu.pas |
(・・・前略・・・)
procedure S_Arc(x,y,r,sa,ea,h,ka:double);
procedure S_Text(no:integer;x1,y1,x2,y2:double;m:string);
(・・・中略・・・)
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 文字列の作図
// no:種別コード
// 0:横文字ch 1:縦文字cv 2:寸法値cs
// 3:半径cr 4:直径co 5:角度cp 6:累寸ct
// 7:日影真北ck 8:日影建物高さcz 9:2.5Dc2
// x1,y1:基準点座標
// x2,y2:文字作図方向を示す座標
// m :作図する文字内容
procedure S_Text(no:integer;x1,y1,x2,y2:double;m:string);
var
s : string ;
begin
if (Abs(x2) <= _LIMIT)and(Abs(y2) <= _LIMIT) then exit ;
if (KTrim(m) = '') then exit ;
Case(no)of
1: s := 'cv';
2: s := 'cs';
3: s := 'cr';
4: s := 'co';
5: s := 'cp';
6: s := 'ct';
7: s := 'ck';
8: s := 'cz';
9: s := 'c2';
else
s := 'ch';
end;
s := s + ' '
+ FloatToStr(x1) + ' '
+ FloatToStr(y1) + ' '
+ FloatToStr(x2) + ' '
+ FloatToStr(y2) + ' "'
+ m ;
SendMem(s);
end;
end. |
MyFunc.pas |
(・・・前略・・・)
procedure Rev(var rx,ry:double;x,y,cx,cy,a:double) ;
function KTrim(s:string): string ;
(・・・中略・・・)
// 空白(全角/半角)を取り除く
function KTrim(s:string): string ;
var
i,i1 : Integer ;
r,t : string ;
begin
r := '' ;
i := 1 ;
i1 := Length(s) ;
while(i <= i1) do begin
if (Ord(s[i]) >= 128)and(Ord(s[i]) <= 159)
or(Ord(s[i]) >= 224)and(Ord(s[i]) <= 253) then begin
// 漢字
t := s[i]+s[i+1] ;
if (t <> ' ') then r := r + t ;
i := i + 2 ;
end
else begin
// ANK
t := s[i] ;
if (t <> ' ')and(Ord(s[i]) >= 32) then r := r + t ;
Inc(i);
end;
end;
Result := r ;
end;
end. |
|
◇寸法図形データ
寸法図形の線、寸法値のレイヤグループ、レイヤ、線色、線種、線幅、文字種については「msg」の前に行うという事にします。寸法値の内容を空状態にした場合は、線データの長さを計算して、丸め処理等は行わない状態で入れる事とします。そのため、長さを計算する関数 Dist をMyFunc.pasに作成します。
|
JwwGaibu.pas |
(・・・前略・・・)
procedure S_Text(no:integer;x1,y1,x2,y2:double;m:string);
procedure S_Dim(lx1,ly1,lx2,ly2, tx1,ty1,tx2,ty2:double;m:string);
(・・・中略・・・)
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 寸法図形の作図
// lx1,ly1:線 始点
// lx2,ly2:線 終点
// tx1,ty1:寸法値 基準点座標
// tx2,ty2:寸法値 文字作図方向を示す座標
// m :寸法値 作図する文字内容
procedure S_Dim(lx1,ly1,lx2,ly2, tx1,ty1,tx2,ty2:double;m:string);
var
s,mm : string ;
d : double ;
begin
if (Abs(lx2-lx1) < _LIMIT)and(Abs(ly2-ly1) < _LIMIT) then exit;
if (Abs(tx2) <= _LIMIT)and(Abs(ty2) <= _LIMIT) then exit ;
mm := m ;
if (KTrim(mm) = '') then begin
d := Dist(lx1,ly1,lx2,ly2) ;
d := Int(d/_LIMIT+0.5)*_LIMIT ; // 誤差を省く為の四捨五入
mm:= FloatToStr(d);
end;
//
SendMem('msg');
s := FloatToStr(lx1) + ' '
+ FloatToStr(ly1) + ' '
+ FloatToStr(lx2) + ' '
+ FloatToStr(ly2) ;
SendMem(s);
s := 'cs '
+ FloatToStr(tx1) + ' '
+ FloatToStr(ty1) + ' '
+ FloatToStr(tx2) + ' '
+ FloatToStr(ty2) + ' "'
+ mm ;
SendMem(s);
end;
end. |
MyFunc.pas |
(・・・前略・・・)
function SDbl(s:string):double ;
function Dist(x1,y1,x2,y2:double):double ;
procedure Rev(var rx,ry:double;x,y,cx,cy,a:double) ;
(・・・中略・・・)
// 距離(長さ)を計算
// x1,y1 : 始点
// x2,y2 : 終点
// out : 距離(長さ)
function Dist(x1,y1,x2,y2:double):double ;
begin
Result := Sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)) ;
end;
(・・・後略・・・) |
|
◇ソリッド図形データ
「lc」については既に作成していますので「sl」等を作成する手続きを作成します。まずは、線形ソリッド、三角形ソリッド、四角形ソリッドから。
|
JwwGaibu.pas |
(・・・前略・・・)
procedure S_Dim(lx1,ly1,lx2,ly2, tx1,ty1,tx2,ty2:double;m:string);
procedure S_Solid2(x1,y1,x2,y2:double);
procedure S_Solid3(x1,y1,x2,y2,x3,y3:double);
procedure S_Solid4(x1,y1,x2,y2,x3,y3,x4,y4:double);
(・・・中略・・・)
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 線形ソリッド図形の作図
// x1,y1:第1点
// x2,y2:第2点
procedure S_Solid2(x1,y1,x2,y2:double);
var
s : string ;
begin
if (Abs(x2-x1) < _LIMIT)and(Abs(y2-y1) < _LIMIT) then exit;
//
s := 'sl '
+ FloatToStr(x1) + ' '
+ FloatToStr(y1) + ' '
+ FloatToStr(x2) + ' '
+ FloatToStr(y2) ;
SendMem(s);
end;
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 三角形ソリッド図形の作図
// x1,y1:第1点
// x2,y2:第2点
// x3,y3:第3点
procedure S_Solid3(x1,y1,x2,y2,x3,y3:double);
var
s : string ;
begin
if (Abs(x2-x1) < _LIMIT)and(Abs(y2-y1) < _LIMIT)
or(Abs(x3-x2) < _LIMIT)and(Abs(y3-y2) < _LIMIT)
or(Abs(x1-x3) < _LIMIT)and(Abs(y1-y3) < _LIMIT) then exit;
//
s := 'sl '
+ FloatToStr(x1) + ' '
+ FloatToStr(y1) + ' '
+ FloatToStr(x2) + ' '
+ FloatToStr(y2) + ' '
+ FloatToStr(x3) + ' '
+ FloatToStr(y3) ;
SendMem(s);
end;
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 四角形ソリッド図形の作図
// x1,y1:第1点
// x2,y2:第2点
// x3,y3:第3点
// x4,y4:第4点
procedure S_Solid4(x1,y1,x2,y2,x3,y3,x4,y4:double);
var
s : string ;
begin
if (Abs(x2-x1) < _LIMIT)and(Abs(y2-y1) < _LIMIT) then begin
S_Solid3(x1,y1,x3,y3,x4,y4);
exit;
end;
if (Abs(x3-x1) < _LIMIT)and(Abs(y3-y1) < _LIMIT) then exit ;
if (Abs(x4-x1) < _LIMIT)and(Abs(y4-y1) < _LIMIT) then begin
S_Solid3(x1,y1,x2,y2,x3,y3);
exit;
end;
if (Abs(x3-x2) < _LIMIT)and(Abs(y3-y2) < _LIMIT) then begin
S_Solid3(x1,y1,x2,y2,x4,y4);
exit;
end;
if (Abs(x4-x2) < _LIMIT)and(Abs(y4-y2) < _LIMIT) then exit ;
if (Abs(x4-x3) < _LIMIT)and(Abs(y4-y3) < _LIMIT) then begin
S_Solid3(x1,y1,x2,y2,x3,y3);
exit;
end;
//
s := 'sl '
+ FloatToStr(x1) + ' '
+ FloatToStr(y1) + ' '
+ FloatToStr(x2) + ' '
+ FloatToStr(y2) + ' '
+ FloatToStr(x3) + ' '
+ FloatToStr(y3) + ' '
+ FloatToStr(x4) + ' '
+ FloatToStr(y4) ;
SendMem(s);
end;
end. |
|
次に、円ソリッド図形、円周ソリッド図形、円環ソリッド図形についての手続きを作成します。
|
JwwGaibu.pas |
(・・・前略・・・)
procedure S_Solid4(x1,y1,x2,y2,x3,y3,x4,y4:double);
procedure S_SolidC(x,y,r,h,ka,sa,da:double;cod:integer);
procedure S_SolidD(x,y,r,h,ka,sa,da:double;cod:integer);
procedure S_SolidO(x,y,r,h,ka,sa,da,ri:double);
procedure S_SolidG(x,y,r,h,ka,sa,da,ri:double);
(・・・中略・・・)
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 円ソリッド図形の作図
// x,y:中心点座標
// r :半径
// h :偏平率(円状態は「1」)
// ka :傾き角度[rad]
// sa :開始角度[rad]
// da :円弧角度[rad]
// cod:円「100」、弓形「5」
// 扇形「0」、円外側「-1」
procedure S_SolidC(x,y,r,h,ka,sa,da:double;cod:integer);
var
s : string ;
begin
if (r <= _LIMIT) then exit ;
if (Abs(h) <= _LIMIT) then exit ;
if (cod <> 100)and(cod <> 5)and(cod <> 0)and(cod <> -1) then exit;
s := 'sc '
+ FloatToStr(x) + ' '
+ FloatToStr(y) + ' '
+ FloatToStr(r) + ' '
+ FloatToStr(h) + ' '
+ FloatToStr(ka) + ' '
+ FloatToStr(sa) + ' '
+ FloatToStr(da) + ' '
+ IntToStr(cod) ;
SendMem(s);
end;
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 円周ソリッド図形の作図
// x,y:中心点座標
// r :半径
// h :偏平率(円状態は「1」)
// ka :傾き角度[rad]
// sa :開始角度[rad]
// da :円弧角度[rad]
// cod:円「100」、円弧「0」
procedure S_SolidD(x,y,r,h,ka,sa,da:double;cod:integer);
var
s : string ;
begin
if (r <= _LIMIT) then exit ;
if (Abs(h) <= _LIMIT) then exit ;
if (cod <> 100)and(cod <> 0) then exit;
s := 'se '
+ FloatToStr(x) + ' '
+ FloatToStr(y) + ' '
+ FloatToStr(r) + ' '
+ FloatToStr(h) + ' '
+ FloatToStr(ka) + ' '
+ FloatToStr(sa) + ' '
+ FloatToStr(da) + ' '
+ IntToStr(cod) ;
SendMem(s);
end;
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 円環ソリッド図形(同一扁平率タイプ)の作図
// x,y:中心点座標
// r :半径
// h :偏平率(円状態は「1」)
// ka :傾き角度[rad]
// sa :開始角度[rad]
// da :円弧角度[rad]
// ri :内円半径
procedure S_SolidO(x,y,r,h,ka,sa,da,ri:double);
var
s : string ;
begin
if (r <= _LIMIT) then exit ;
if (ri <= _LIMIT)or(ri >= (r-_LIMIT)) then exit ;
if (Abs(h) <= _LIMIT) then exit ;
s := 'so '
+ FloatToStr(x) + ' '
+ FloatToStr(y) + ' '
+ FloatToStr(r) + ' '
+ FloatToStr(h) + ' '
+ FloatToStr(ka) + ' '
+ FloatToStr(sa) + ' '
+ FloatToStr(da) + ' '
+ FloatToStr(ri) ;
SendMem(s);
end;
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 円環ソリッド図形(同一幅タイプ)の作図
// x,y:中心点座標
// r :半径
// h :偏平率(円状態は「1」)
// ka :傾き角度[rad]
// sa :開始角度[rad]
// da :円弧角度[rad]
// ri :内円半径
procedure S_SolidG(x,y,r,h,ka,sa,da,ri:double);
var
s : string ;
begin
if (r <= _LIMIT) then exit ;
if (ri <= _LIMIT)or(ri >= (r-_LIMIT)) then exit ;
if (Abs(h) <= _LIMIT) then exit ;
s := 'sg '
+ FloatToStr(x) + ' '
+ FloatToStr(y) + ' '
+ FloatToStr(r) + ' '
+ FloatToStr(h) + ' '
+ FloatToStr(ka) + ' '
+ FloatToStr(sa) + ' '
+ FloatToStr(da) + ' '
+ FloatToStr(ri) ;
SendMem(s);
end;
end. |
|
◆分割点の作図
それでは分割点について考えます。例えば、線を4分割するような点を作図する場合、始点〜終点の長さを4で割った位置に点を作図しますから、まず、線の長さを計算する事、そして、始点から終点方向へ長さ分の位置へ、という事になりますので、始点から終点への角度を計算する必要があります。MyFunc.pasに角度を計算する関数 Angle を作成します。ArcTan2関数を利用しているので uses節で Math を指定します。
|
MyFunc.pas |
unit MyFunc;
interface
uses
Math ;
const
_LIMIT = 0.00000001;
_LIMITN = 0.0000000001;
function SInt(s:string):integer ;
function SDbl(s:string):double ;
function Dist(x1,y1,x2,y2:double):double ;
function Angle(dx,dy:double):double ;
procedure Rev(var rx,ry:double;x,y,cx,cy,a:double) ;
(・・・中略・・・)
// 角度を計算
// dx : X方向差分
// dy : Y方向差分
// out: 角度 (0〜2*Pi)
function Angle(dx,dy:double):double ;
var
r : double ;
begin
Result := 0.0 ;
if (Abs(dx) < _LIMITN)and(Abs(dy) < _LIMITN) then exit ;
r := ArcTan2(dy,dx);
if (r < 0.0) then r := r + 2.0 * Pi ;
Result := r ;
end;
// 回転
(・・・後略・・・) |
|
分割点は現在のレイヤグループ・レイヤに作図したいので、バッチファイルで「REM #bz」を指定し、「bz」を含めるようにして図寸モードにしています。選択した線等と同じレイヤグループに入れるのであれば実寸モードでも良いです。レイヤグループの縮尺を考慮して掛けるのであれば現在のレイヤグループで実寸で、という事も可能ですが、こちらの方が簡単です。
|
Unit1.pas |
(・・・前略・・・)
// [OK]
procedure TForm1.Button1Click(Sender: TObject);
var
n : integer ;
i,j,k : integer ;
d,a,xx,yy,rx,ry : double ;
begin
n := SInt(Edit1.Text) ;
if (n < 2)or(n > 10000) then exit;
SendMem('bz'); // 図寸モード
S_LGrp(JG_CurLGrp); // 現在のレイヤグループ
S_Lay( JG_CurLay); // 現在のレイヤ
S_PCol(JG_CurCol,0); // 現在の線色
// 線データの分割
for i:=0 to JW_EntLineN-1 do begin
with JW_EntLine[i] do begin
d := Dist(x1,y1,x2,y2)/n;
a := Angle(x2-x1,y2-y1);
xx:= x1;
yy:= y1;
for j:=1 to n-1 do begin
xx := xx + d*Cos(a);
yy := yy + d*Sin(a);
S_Ten(xx,yy);
end;
end;
end;
// 円データの分割
for i:=0 to JW_EntCircN-1 do begin
with JW_EntCirc[i] do begin
a := 0.0;
for j:=1 to n do begin
xx := cx + cr*Cos(a);
yy := cy + cr*Sin(a);
S_Ten(xx,yy);
a := a + 2.0*Pi/n ;
end;
end;
end;
// 弧・楕円データの分割
for i:=0 to JW_EntArcN-1 do begin
with JW_EntArc[i] do begin
a := sa/180.0*Pi ;
d := ea - sa ;
while (d <= 0.0) do d := d + 360.0;
while (d > 360.0) do d := d - 360.0;
k := n-1 ;
if (Abs(d-360.0) <= _LIMITN) then begin
k := n;
a := 0.0;
end;
d := d/n/180*Pi ;
for j:=1 to k do begin
a := a + d ;
xx := cr *Cos(a);
yy := cr*he*Sin(a);
Rev(rx,ry,xx,yy,0.0,0.0,ka);
xx := cx + rx ;
yy := cy + ry ;
S_Ten(xx,yy);
end;
end;
end;
Close ;
end;
(・・・後略・・・) |
|
弧・楕円データの場合、傾きがありますので、楕円の場合には回転処理を行わないと座標値が合わなくなります。また、全円状態の場合には開始角度が「?」な場所になる場合がありますので 0°地点から開始という事にしています。
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
Windowsのエクスプローラ等で、「C:\DelphiProgram\jww\p033」内に作成された「p033.exe」をフォルダ「Gapp」内へコピーします。外部変形を実行して動作確認をしてみて下さい。
今回のバッチファイルと実行ファイル、及び、ソースファイルについては、Pcataサイトに置いておきますので必要な方はそちらからダウンロードして下さい。
|
|
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
M7
Jw_cad
[BACK]
[NEXT]
|