|
【Jw_cad 外部変形】SXF線色線種を通常線色線種に変更 |
前回は範囲選択した要素データの線色を、指定した1色に変更する外部変形アプリケーションを作成しました。線色の次は線種、そして線幅、レイヤ、となるのがお約束ですが、プログラム的な差異は余りありませんので、それについてはいつでも作成出来ると思いますのでパスして、今回は、DXFファイルやSXFファイルを開いた時に、Jw_cadユーザーにはネックになっているらしい、SXF対応拡張線色・線種を 通常の線色・線種に変更する外部変形アプリケーションについて考えます。
当方では外部ツール(単独実行型のアプリケーションソフト)として「JW色線種変換」や「JW色線幅・線種変換」というソフトウェアを公開していますが、外部変形アプリケーションとして考えてみます。外部変形アプリケーションはブロック図形内を変更する事は出来ませんが(※Jw_cad にてブロック編集を行った上であれば可能)、Jw_cadを実行しながら利用出来るという事と、やや気楽に使えるというメリットはあると思われます。
基本的には、前回の線色変更と同じですが、
・SXF対応拡張線色のNo.1〜16をそれぞれ変更指定
・SXF対応拡張線色のユーザー定義色をある1色に変更指定
(240色もありますので手動では設定出来ないと思われます)
・SXF対応拡張線種のNo.1〜15をそれぞれ変更指定
・SXF対応拡張線種のユーザー定義線種をある1種に変更指定
を設定画面にて行います。
設定内容は設定ファイルに保存し、読み出し出来るようにします。通常線色・線種のものは何もしません。ソリッド図形の任意色についてもそのまま何もしません。
外部変形では、SXF対応拡張線色線種のユーザー定義情報については書き出されませんので、どういう風に設定されているかを知る事は出来ません。ですので、似ている色に変換したくても出来ない、という事もあって、ユーザー定義についてはある1つに設定してしまう、という具合にします。
それではバッチファイルから。前回とほぼ同じです。
|
p045_SXF→通常・線色線種変更.bat |
REM p045−SXF→通常・線色線種変更
@echo off
REM #jww
REM #cd
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #h1
REM #hc 範囲選択をして下さい。
REM #ht10
REM #g1
REM #hr
start /w p045.exe |
|
プロジェクト「p045」の準備を行います。「C:\DelphiProgram\jww」フォルダの中に「p045」というフォルダを作成し、Delphi6を起動します。メニュー「プロジェクト」→「オプション」を実行し、下記の設定を行います。
[アプリケーション]頁
タイトル | p045−SXF→通常・線色線種変更 |
[ディレクトリ/条件]頁
パス及びディレクトリ | C:\DelphiProgram\jww\p045 |
メニュー「ファイル」→「名前を付けて保存」
「C:\DelphiProgram\jww\p045」の中に「Unit1.pas」を保存
メニュー「ファイル」→「プロジェクトに名前を付けて保存」
「C:\DelphiProgram\jww\p045」の中に「p045.dpr」として保存
◆
Form1の画面は、取りあえずいつもと同じく、大きさを扱いやすいよう小さくし、オブジェクトインスペクタで Form1 のプロパティを設定します。
BorderIcons
biMaximize | False | 最大化しないように |
BorderStyle | bsSingle | 画面をリサイズしないように |
Caption | SXF→通常・線色線種変更 | タイトルバーに表示されます |
Color | clWhite | お好みでどうぞ |
Font内
Name | MS ゴシック |
プロポーショナルフォントは
文字配置調整が微妙なので |
Font内
Size | 10 | 小さいと少し見難い為 |
Scaled | False |
動作環境によっての文字の
大きさ変動を少し抑えられる |
メニュー「表示」→「プロジェクトマネージャ」
を実行し、コード画面の左側にドッキングさせておきます。前回作成した「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\p045」の中に「Icon1.ico」として保存します。保存できたらイメージエディタを終了します。
メニュー「プロジェクト」→「オプション」を実行し、
[アプリケーション]頁の中の[アイコンの読み込み]ボタンをクリックし、「C:\DelphiProgram\jww\p045\Icon1.ico」を指定します。[OK]ボタンをクリックしてプロジェクトオプション画面を閉じます。
オブジェクトインスペクタにて、Form1 の Icon プロパティの入力欄右端の[…]をクリックして、[読み込み]ボタンをクリックし、「Icon1」を指定して、[OK]ボタンをクリックします。
◆
オブジェクトインスペクタにて Form1 の イベント OnShowの箇所でダブルクリック、OnCloseの箇所でダブルクリックし、取りあえず下記のように追記します。
|
Unit1.pas |
(・・・前略・・・)
type
TForm1 = class(TForm)
(・・・)
private
{ Private 宣言 }
AppPath : string ;
procedure OpenDatFile ;
procedure SaveDatFile ;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// データファイルを読み込む
procedure TForm1.OpenDatFile ;
var
fn: string ;
F : TextFile ;
begin
fn := ChangeFileExt(Application.ExeName,'.dat') ;
// 読み込み
if not(FileExists(fn)) then exit;
try
AssignFile(F, fn);
FileMode := 0;
Reset(F);
CloseFile(F);
except
CloseFile(F);
end;
end;
// データファイルを保存する
procedure TForm1.SaveDatFile ;
var
fn: string ;
F : TextFile ;
begin
fn := ChangeFileExt(Application.ExeName,'.dat') ;
try
AssignFile(F, fn);
ReWrite(F);
CloseFile(F);
except
CloseFile(F);
if FileExists(fn) then DeleteFile(fn);
end;
end;
// 起動時
procedure TForm1.FormShow(Sender: TObject);
begin
Form1.Left := Mouse.CursorPos.X - Form1.Width div 2;
Form1.Top := Mouse.CursorPos.Y - 4;
// 初期設定
InitJwwGaibu ;
// プログラムのあるフォルダを取得します
AppPath := ExtractFilePath(Application.ExeName) ;
// JWC_TEMP.TXTを開きます
OpenTempFile(AppPath+'JWC_TEMP.TXT') ;
// 初期設定
S_Init ;
OpenDatFile ;
end;
// 終了時
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// JWC_TEMP.TXTを保存します
SaveTempFile(AppPath+'JWC_TEMP.TXT') ;
// 最終処理
EndJwwGaibu ;
end;
end. |
|
画面上に [Standard]内の GroupBox コンポーネントを2つ配置し、Captionプロパティをそれぞれ「線色変更指定(&C)」「線種変更指定(&T)」とします。GroupBox1の中に Label コンポーネントとComboBox コンポーネントを1つずつ配置し、プロパティを指定します。
|
Label1
ComboBox1
ImeMode | imDisable | 全角入力出来ないように |
Style | csDropDownList | キー入力せず項目選択のみ |
|
これを GroupBox1 内でコピー&貼り付けし、合計17個にして、各Label の Caption プロパティを変更します(SXF No.1〜16、USER)。そして、LabelとComboBoxのペア No.1〜15,USER をコピーし、GroupBox2 内でペーストします。Button コンポーネントを3つ配置し、それぞれ以下のようにプロパティを指定します。
|
Button1
Caption | OK(&Y) | ボタン上の文字 |
Default | True | [Enter]キーを押したら[OK] |
Button2
Caption | キャンセル(&N) | ボタン上の文字 |
Cancel | True | [Esc]キーを押したら[キャンセル] |
Button3
|
画面のレイアウトは下図のようにしてみました。
Button1、Button2、Button3 をダブルクリックして OnClickイベントを記述出来るようにします。取りあえず以下のように書いておきます。設定初期化では、3点鎖線は2点鎖線に等の指定をしていますが都合に合わせて内容を変更してみて下さい。
|
Unit1.pas |
(・・・前略・・・)
type
TForm1 = class(TForm)
(・・・)
private
{ Private 宣言 }
AppPath : string ;
cl : array[1..17] of integer ;
tp : array[1..16] of integer ;
procedure OpenDatFile ;
(・・・)
// データファイルを読み込む
procedure TForm1.OpenDatFile ;
var
fn: string ;
F : TextFile ;
i : integer ;
s : string ;
begin
fn := ChangeFileExt(Application.ExeName,'.dat') ;
for i:=1 to 17 do
cl[i] := 0 ;
for i:=1 to 16 do
tp[i] := 0 ;
(・・・)
Reset(F);
for i:=1 to 17 do begin
ReadLn(F, s);
cl[i] := SInt(s);
end;
for i:=1 to 16 do begin
ReadLn(F, s);
tp[i] := SInt(s);
end;
(・・・)
// データファイルを保存する
procedure TForm1.SaveDatFile ;
var
fn: string ;
F : TextFile ;
i : integer ;
begin
(・・・)
ReWrite(F);
for i:=1 to 17 do
WriteLn(F, IntToStr(cl[i]));
for i:=1 to 16 do
WriteLn(F, IntToStr(tp[i]));
(・・・)
// 起動時
procedure TForm1.FormShow(Sender: TObject);
var
i,j : integer ;
cp: TComponent ;
begin
(・・・)
// 初期設定
S_Init ;
OpenDatFile ;
for i:=1 to 17 do begin
cp := FindComponent('ComboBox'+IntToStr(i));
with TComboBox(cp) do begin
Items.Clear ;
Items.Add('現在線色');
for j:=1 to 9 do
Items.Add('線色'+IntToStr(j));
ItemIndex := cl[i] ;
end;
end;
for i:=18 to 33 do begin
cp := FindComponent('ComboBox'+IntToStr(i));
with TComboBox(cp) do begin
Items.Clear ;
Items.Add('現在線種');
for j:=1 to 9 do
Items.Add('線種'+IntToStr(j));
for j:=1 to 5 do
Items.Add('ランダム線'+IntToStr(j));
for j:=1 to 4 do
Items.Add('倍長線種'+IntToStr(j));
ItemIndex := tp[i-17] ;
end;
end;
end;
// [OK]
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer ;
cp: TComponent ;
begin
for i:=1 to 17 do begin
cp := FindComponent('ComboBox'+IntToStr(i));
cl[i] := TComboBox(cp).ItemIndex ;
end;
for i:=18 to 33 do begin
cp := FindComponent('ComboBox'+IntToStr(i));
tp[i-17] := TComboBox(cp).ItemIndex ;
end;
SaveDatFile ;
Close ;
end;
// [Cancel]
procedure TForm1.Button2Click(Sender: TObject);
begin
Close ;
end;
// [設定初期化]
// Jw_cad 白背景初期値に合わせた?設定にする
procedure TForm1.Button3Click(Sender: TObject);
begin
// 線色
ComboBox1.ItemIndex := 2;
ComboBox2.ItemIndex := 8;
ComboBox3.ItemIndex := 3;
ComboBox4.ItemIndex := 6;
ComboBox5.ItemIndex := 4;
ComboBox6.ItemIndex := 5;
ComboBox7.ItemIndex := 1;
ComboBox8.ItemIndex := 2;
ComboBox9.ItemIndex := 5;
ComboBox10.ItemIndex := 4;
ComboBox11.ItemIndex := 4;
ComboBox12.ItemIndex := 3;
ComboBox13.ItemIndex := 6;
ComboBox14.ItemIndex := 5;
ComboBox15.ItemIndex := 2;
ComboBox16.ItemIndex := 2;
ComboBox17.ItemIndex := 2;
// 線種
ComboBox18.ItemIndex := 1;
ComboBox19.ItemIndex := 4;
ComboBox20.ItemIndex := 3;
ComboBox21.ItemIndex := 5;
ComboBox22.ItemIndex := 7;
ComboBox23.ItemIndex := 7;
ComboBox24.ItemIndex := 2;
ComboBox25.ItemIndex := 6;
ComboBox26.ItemIndex := 8;
ComboBox27.ItemIndex := 6;
ComboBox28.ItemIndex := 6;
ComboBox29.ItemIndex := 8;
ComboBox30.ItemIndex := 8;
ComboBox31.ItemIndex := 8;
ComboBox32.ItemIndex := 8;
ComboBox33.ItemIndex := 1;
end;
end. |
|
それでは、実際の線色・線種の変更処理の部分を記述します。前回の「線色変更」を流用すれば比較的容易に記述出来ると思います。Labelコンポーネントを配置し、プロパティを指定します。
|
Name | LabelM | オブジェクト名 |
Align | alBottom | 画面下部に表示 |
Alignment | taCenter | 文字内容を水平センタリング |
AutoSize | False | 自動でサイズを変えない |
Caption | | 文字表示されていない状態に |
Color | clMoneyGreen | 表示色 御自由にどうぞ |
Height | 17 | 垂直方向サイズをやや大きく |
Layout | tlCenter | 文字内容を垂直センタリング |
|
|
Unit1.pas |
(・・・前略・・・)
type
TForm1 = class(TForm)
(・・・)
private
{ Private 宣言 }
(・・・)
procedure SaveDatFile ;
procedure TS_Col(ac:integer);
procedure TS_Ltp(at:integer);
(・・・)
// 線色変更
procedure TForm1.TS_Col(ac:integer);
begin
if (ac <= 9) then
S_Col(ac,0)
else begin
if (ac >= 101)and(ac <= 116) then
S_Col(cl[ac-100],1)
else
S_Col(cl[17],1);
end;
end;
// 線種変更
procedure TForm1.TS_Ltp(at:integer);
begin
if (at <= 19) then
S_Ltp(at,0)
else begin
if (at >= 31)and(at <= 45) then
S_Ltp(tp[at-30],1)
else
S_Ltp(tp[16],1);
end;
end;
// [OK]
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,k,cn : integer ;
cp: TComponent ;
f : Boolean ;
begin
(・・・)
SaveDatFile ;
//
cn:= 0 ;
SendMem('hd');
for j:=0 to JW_EntN-1 do begin
if ((j mod 100) = 0) then begin
LabelM.Caption := '処理中(ESC:中断):'+IntToStr(j+1)+'/'+IntToStr(JW_EntN);
LabelM.Update ;
if ((GetAsyncKeyState(VK_ESCAPE)and $8000) > 0) then begin
StopJwwGaibu ;
break; // [ESC]
end;
end;
i := JW_EntNo[j].no ;
Case(JW_EntNo[j].yn) of
1:begin // 線データ
with JW_EntLine[i] do begin
S_LGrp(att.LGrp);
S_Lay(att.Lay);
TS_Col(att.Col);
TS_Ltp(att.Ltp);
S_Wid(att.Wid);
if (CrvNo > 0) then begin
if (CrvNo <> cn) then begin
S_PLineStart ;
cn := CrvNo ;
end;
end;
S_Attr(att.Attr);
S_Line(x1,y1,x2,y2);
end;
// 次の要素が線分で同じ曲線属性かどうかをチェック
f := False ;
if ((j+1) <= (JW_EntN-1)) then begin
if (JW_EntNo[j+1].yn = 1)and(cn > 0) then begin
k := JW_EntNo[j+1].no ;
if (JW_EntLine[k].CrvNo = cn) then
f := True ;
end;
end;
if not(f) then begin
if (cn > 0) then
S_PLineEnd ;
cn := 0;
end;
end;
2:begin // 円データ
with JW_EntCirc[i] do begin
S_LGrp(att.LGrp);
S_Lay(att.Lay);
TS_Col(att.Col);
TS_Ltp(att.Ltp);
S_Wid(att.Wid);
S_Attr(att.Attr);
S_Circle(cx,cy,cr);
end;
end;
3:begin // 弧・楕円データ
with JW_EntArc[i] do begin
S_LGrp(att.LGrp);
S_Lay(att.Lay);
TS_Col(att.Col);
TS_Ltp(att.Ltp);
S_Wid(att.Wid);
S_Attr(att.Attr);
S_Arc(cx,cy,cr,sa,ea,he,ka);
end;
end;
4:begin // 文字データ
with JW_EntText[i] do begin
S_LGrp(att.LGrp);
S_Lay(att.Lay);
if (att.Col <= 9) then
S_Mjs(cn,mw,mh,md,att.Col,0)
else begin
if (att.Col >= 101)and(att.Col <= 116) then
S_Mjs(0,mw,mh,md,cl[att.Col-100],1)
else
S_Mjs(0,mw,mh,md,cl[17],1);
end;
S_Mbs(cc);
S_Font(fo);
S_Attr(att.Attr);
S_Text(no,x1,y1,x2,y2,st);
end;
end;
5:begin // 点データ
with JW_EntPnt[i] do begin
S_LGrp(att.LGrp);
S_Lay(att.Lay);
if (att.Col <= 9) then
S_PCol(att.Col,0)
else begin
if (att.Col >= 101)and(att.Col <= 116) then
S_PCol(cl[att.Col-100],1)
else
S_PCol(cl[17],1);
end;
S_Attr(att.Attr);
S_Ten(px,py);
end;
end;
6:begin // 点マーカデータ
with JW_EntMark[i] do begin
S_LGrp(att.LGrp);
S_Lay(att.Lay);
if (att.Col <= 9) then
S_PCol(att.Col,0)
else begin
if (att.Col >= 101)and(att.Col <= 116) then
S_PCol(cl[att.Col-100],1)
else
S_PCol(cl[17],1);
end;
S_Wid(att.Wid);
S_Attr(att.Attr);
S_Mark(px,py,bai,ang,cod);
end;
end;
7:begin // 寸法図形データ
with JW_EntDim[i] do begin
S_LGrp(att.LGrp);
S_Lay(att.Lay);
with lin do begin
TS_Col(att.Col);
TS_Ltp(att.Ltp);
S_Wid(att.Wid);
end;
with txt do begin
if (att.Col <= 9) then
S_Mjs(cn,mw,mh,md,att.Col,0)
else begin
if (att.Col >= 101)and(att.Col <= 116) then
S_Mjs(0,mw,mh,md,cl[att.Col-100],1)
else
S_Mjs(0,mw,mh,md,cl[17],1);
end;
S_Mbs(cc);
S_Font(fo);
end;
S_Attr(att.Attr);
S_Dim(lin.x1,lin.y1,lin.x2,lin.y2, txt.x1,txt.y1,txt.x2,txt.y2, txt.st);
end;
end;
9:begin // 線形ソリッド図形データ
with JW_EntSld2[i] do begin
S_LGrp(att.LGrp);
S_Lay(att.Lay);
if (att.Col <> 10) then
TS_Col(att.Col)
else
S_SCol(Color);
S_Wid(att.Wid);
S_Attr(att.Attr);
S_Solid2(x1,y1,x2,y2);
end;
end;
10:begin // 三角形ソリッド図形データ
with JW_EntSld3[i] do begin
S_LGrp(att.LGrp);
S_Lay(att.Lay);
if (att.Col <> 10) then
TS_Col(att.Col)
else
S_SCol(Color);
S_Attr(att.Attr);
S_Solid3(x1,y1,x2,y2,x3,y3);
end;
end;
11:begin // 四角形ソリッド図形データ
with JW_EntSld4[i] do begin
S_LGrp(att.LGrp);
S_Lay(att.Lay);
if (att.Col <> 10) then
TS_Col(att.Col)
else
S_SCol(Color);
S_Attr(att.Attr);
S_Solid4(x1,y1,x2,y2,x3,y3,x4,y4);
end;
end;
12:begin // 円ソリッド図形データ
with JW_EntSldC[i] do begin
S_LGrp(att.LGrp);
S_Lay(att.Lay);
if (att.Col <> 10) then
TS_Col(att.Col)
else
S_SCol(Color);
S_Attr(att.Attr);
S_SolidC(cx,cy,cr,he,ka,sa,da,fl);
end;
end;
13:begin // 円周ソリッド図形データ
with JW_EntSldE[i] do begin
S_LGrp(att.LGrp);
S_Lay(att.Lay);
if (att.Col <> 10) then
TS_Col(att.Col)
else
S_SCol(Color);
S_Wid(att.Wid);
S_Attr(att.Attr);
S_SolidD(cx,cy,cr,he,ka,sa,da,fl);
end;
end;
14:begin // 円環ソリッド1図形データ
with JW_EntSldO[i] do begin
S_LGrp(att.LGrp);
S_Lay(att.Lay);
if (att.Col <> 10) then
TS_Col(att.Col)
else
S_SCol(Color);
S_Attr(att.Attr);
S_SolidO(cx,cy,cr,he,ka,sa,da,ri);
end;
end;
15:begin // 円環ソリッド2図形データ
with JW_EntSldG[i] do begin
S_LGrp(att.LGrp);
S_Lay(att.Lay);
if (att.Col <> 10) then
TS_Col(att.Col)
else
S_SCol(Color);
S_Attr(att.Attr);
S_SolidG(cx,cy,cr,he,ka,sa,da,ri);
end;
end;
end;
end;
LabelM.Caption := 'ファイル生成中です';
LabelM.Update ;
Close ;
end;
(・・・後略・・・) |
|
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
Windowsのエクスプローラ等で、「C:\DelphiProgram\jww\p045」内に作成された「p045.exe」をフォルダ「Gapp」内へコピーします。外部変形を実行して動作確認をしてみて下さい。
今回のバッチファイルと実行ファイル、及び、ソースファイルについては、Pcataサイトに置いておきますので必要な方はそちらからダウンロードして下さい。
|
|
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
M7
Jw_cad
[BACK]
[NEXT]
|