AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
【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最大化しないように
BorderStylebsSingle画面をリサイズしないように
CaptionSXF→通常・線色線種変更タイトルバーに表示されます
ColorclWhiteお好みでどうぞ
Font内
 Name
MS ゴシック プロポーショナルフォントは
文字配置調整が微妙なので
Font内
 Size
10小さいと少し見難い為
ScaledFalse 動作環境によっての文字の
大きさ変動を少し抑えられる

メニュー「表示」→「プロジェクトマネージャ」
を実行し、コード画面の左側にドッキングさせておきます。前回作成した「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
CaptionSXF No. 1 →表示内容
ComboBox1
ImeModeimDisable全角入力出来ないように
StylecsDropDownListキー入力せず項目選択のみ
これを GroupBox1 内でコピー&貼り付けし、合計17個にして、各Label の Caption プロパティを変更します(SXF No.1〜16、USER)。そして、LabelとComboBoxのペア No.1〜15,USER をコピーし、GroupBox2 内でペーストします。Button コンポーネントを3つ配置し、それぞれ以下のようにプロパティを指定します。
Button1
CaptionOK(&Y)ボタン上の文字
DefaultTrue[Enter]キーを押したら[OK]
Button2
Captionキャンセル(&N)ボタン上の文字
CancelTrue[Esc]キーを押したら[キャンセル]
Button3
Caption設定初期化(&I)ボタン上の文字
画面のレイアウトは下図のようにしてみました。

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コンポーネントを配置し、プロパティを指定します。
NameLabelMオブジェクト名
AlignalBottom画面下部に表示
AlignmenttaCenter文字内容を水平センタリング
AutoSizeFalse自動でサイズを変えない
Caption  文字表示されていない状態に
ColorclMoneyGreen表示色 御自由にどうぞ
Height17垂直方向サイズをやや大きく
LayouttlCenter文字内容を垂直センタリング

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]
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015 By AFsoft All Rights Reserved.