HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2023/05/14

水魚堂さんのフリーソフトウェアの回路図エディタ BSch3Vのイメージファイル出力の倍率を変更する方法 水魚堂さんのフリーソフトウェアの回路図エディタ BSch3Vのイメージファイル出力の倍率を変更する方法

(ExpImageMagを 200にする事で最大 2倍に拡大されます、ソースを改造で最大 2倍のリミッタを解除できます)

Tags: [電子工作]




●水魚堂さんのフリーソフトウェアの回路図エディタ BSch3Vのイメージファイル出力の倍率を変更する方法

 Windwosで使える回路図エディタが必要になったので、
居酒屋ガレージ日記
 の下間さんのブログで存在を知っていた水魚堂さんの BSch3Vをインストールしました。
水魚堂の回路図エディタ

 回路図エディタとして Fritzingも有名ですが、回路図を画像に書き出す機能で生成される画像がイケて無いから他のを探そう、となったのです。
Welcome to Fritzing

 そして、BSch3Vで回路図を書いて「イメージファイル出力」で PNG画像を生成できますが、生成画像が 1倍なので、若干 文字同士や文字と配線がくっ付いている様に見えて判読にミスが生じそうな懸念が有りました。

・BSch3Vの回路図を PNG画像で書き出す方法
BSch3Vの回路図を PNG画像で書き出す方法



・BSch3Vの回路図の「イメージファイル出力」の例
BSch3Vの回路図の「イメージファイル出力」の例


 サンプルの LEDPORT.CE3を出力。

 しかし、BSch3Vは超軽量なアプリで、説明を読まなくても普通に操作ができたので手放したくありません。

 幸い、BSch3Vはソースリストも公開されています。

 と言う訳で、画像出力している所の処理で出力倍率を変更する方法を探りました。

●急いでいる人用の結論
 BSCH3.INIの iniファイルの [Option]のセクションに ExpImageMag=200を追加すると 2倍になる。

●以下は BSch3Vのプログラムの解析内容

 先ずはソースの中で画像出力している所の処理を探します。

 Print.cppに有りました!

Print.cpp
/////////////////////////////////////////////////////////
//ビットマップファイルのExportコマンドハンドラ
void CBSchView::OnFileExpoBmp()
{
  // TODO: この位置にコマンド ハンドラ用のコードを追加してください


  //0.64.03で、GDIPLUS.DLLが使えるときは、CImageを使ってPNGやGIFで保存できるようにした。
  CString strFilter;

...

    if(!ExportBitmapFile(rBmpName)){

...

BOOL CBSchView::ExportBitmapFile(LPCTSTR pszFileName)
{
  BOOL bColorMode = AfxGetApp()->GetProfileInt(_T("Option"),_T("PrintColor"),FALSE);
  BOOL bPrintBgWhite = AfxGetApp()->GetProfileInt(_T("Option"),_T("PrintBgWhite"),1);
  bool bUseImage = true;

  int nMag = IniReadExpImageMag();

  int image_x, image_y;

...

  //if(bUseImage){
    CSize sizeSheet;
    CBSchDoc* pDoc = GetDocument();
    sizeSheet=pDoc->GetSheetSize();

    image_x = sizeSheet.cx * nMag /100;    //2016/05/04
    image_y = sizeSheet.cy * nMag /100;    //2016/05/04

 IniReadExpImageMag()と後続の sizeSheet.cx * nMag /100の処理で倍率をしていそうです!!

 と言う訳で、IniReadExpImageMag()を探します。

 Bschview.cppに有りました!

Bschview.cpp
//レジストリから画像出力倍率の読み込み 2016/05/03
int  CBSchView::IniReadExpImageMag()
{
  int res= AfxGetApp()->GetProfileInt(_T("Option"),_T("ExpImageMag"),100);
  if(res<100) return 100;
  if(res>200) return 200;
  return res;
}

 処理を見ると iniファイルの Optionセクションから ExpImageMagと言うキー名で読み込んでいます。
 また、100~200の範囲でガード処理が有ります。

 早速 bsch3v.exeの実行ファイルの所に在る BSCH3.INIの iniファイルをテキストエディタで開きます。

 先頭に [Option]のセクションが在るので ExpImageMag=200の行を追加します。
・BSCH3.INIの iniファイルの [Option]のセクションに ExpImageMag=200を追加する
BSCH3.INIの iniファイルの [Option]のセクションに ExpImageMag=200を追加する



 そして、BSch3Vで「イメージファイル出力」をしてみます。

 やりました! 2倍で出力できました!!!

・ExpImageMag=200で「イメージファイル出力」の例
ExpImageMag=200で「イメージファイル出力」の例



 しかし、2倍でも充分と言えば充分ですがもうチョイ欲しいと言う欲もあります。

 やりましょう!

 と言う訳で、先ずはソースプログラムの
  if(res>200) return 200;
を
  if(res>400) return 400;
 で Visual Studio 2017でビルドします。

 そして、ExpImageMagを 400にして、BSch3Vで「イメージファイル出力」をしてみます。

 やりました! 4倍で出力できました!!!

 ソースリストが有るととても助かります!

・ExpImageMag=400で「イメージファイル出力」の例
ExpImageMag=400で「イメージファイル出力」の例



● 3倍の例
・ExpImageMag=300で「イメージファイル出力」の例
ExpImageMag=300で「イメージファイル出力」の例





● bsch3v.exeのバイナリを改造する方法

 Visual Studioでプログラムをビルドするのが面倒くさい、と言う本ページの読者の人向けにオリジナルの bs3vp160504rtl.zipの
bsch3v.exe 2016/05/04 18:40:15
CRC32: C5BD6D21
MD5: E3FFD1999B977FA35F5326E90FB52666
SHA-1: 569A62C2DB1264681F42AEA6E6EFEA505BA84EB4
SHA-256: 4AC381A984B73F9C108A0DF9B1EE9F978D987A606318FCD67DDC292D5D1C8234
 のバイナリを改変する方法を書きます。

 単純に 200と大小比較をしているから 200の 16進数 C8の箇所を探せば良いだろう、で C8 00でバイナリ検索しましたが該当箇所が沢山有りすぎます。100との比較処理も有るので近傍に 64 00のバイナリが有る所、とも思いましたが面倒です。
 >> 後から気が付きましたが intは 16 bitでは無く 32bitなので C8 00 00 00の 4バイトで検索していれば対象を絞れたかも?

 と言う訳で、Visual Studioで 200の時と 400の時とで bsch3v.exeをビルドして双方のファイルで差異部分を探しました。

 ビンゴ!アッサリ見つかりました!

・BSch3Vの IniReadExpImageMagの処理の所
BSch3Vの IniReadExpImageMagの処理の所



 バイナリの並びから
B8 64 00 00 00 が if(res<100) return 100;の行
B9 C8 00 00 00 が if(res>200) return 200;の行
 に関係しそう、と言う事が判ります。

 と言う訳で、そのバイナリ列(B8 64 00 00 00 C3 B9 C8 00)を元にオリジナルの bsch3v.exeを検索します。

 ビンゴ!アッサリ見つかりました!

・BSch3Vの IniReadExpImageMagの処理の所、オリジナルの bsch3v.exe
BSch3Vの IniReadExpImageMagの処理の所、オリジナルの bsch3v.exe



B9 C8 00 00 00
 を
B9 90 01 00 00
 にすると最大値が 200から 400に成ります。

・オリジナルの bsch3v.exeの ExpImageMagの改変場所
オリジナルの bsch3v.exeの ExpImageMagの改変場所



 なお、バイナリエディタはみんな大好き Stirlingを使用しています。
Stirling - 使いやすさと高機能を両立した最強の新・定番バイナリエディタ


● PrintColor=1を追加するとカラー出力に成ります

 PrintColor=1を追加すると画面表示と同じ色のカラー出力の画像に成ります。

Print.cpp
BOOL CBSchView::ExportBitmapFile(LPCTSTR pszFileName)
{
	BOOL bColorMode = AfxGetApp()->GetProfileInt(_T("Option"),_T("PrintColor"),FALSE);

BSCH3.INI
[Option]
PrintColor=1

・BSch3Vの回路図をカラー画像で書き出す方法
BSch3Vの回路図をカラー画像で書き出す方法



● 2.5倍でカラー出力の例
・BSch3Vの回路図をカラー画像で書き出す方法、2.5倍でカラー出力の例
BSch3Vの回路図をカラー画像で書き出す方法、2.5倍でカラー出力の例





●その後、BSch3Vの履歴に書いてありました

 倍率もカラー出力も印刷オプションダイアログで変更できます。(iniファイルの直接編集は不要)
 但し設定可能な倍率の最大値は 200まで。

BSch3Vの履歴
2016/05/04 Version 0.83.01
 ライブラリ設定ダイアログにおいて、相対パスに対応。
 印刷オプションダイアログでイメージ出力時の倍率を設定できるように変更(100~200%)

 最新の 2021/09/25 Version 0.83.06
bsch3v08306j.zip
 も、バイナリ列(B8 64 00 00 00 C3 B9 C8 00)を元に検索で対応できました。

 0x6A98番地からの C4 00を 90 01に書き換える。

 印刷オプションダイアログの範囲チェックはここでした。
 ここの 200も 400に書き換えれば大丈夫!
Printopt.cpp
  if(m_nImageMag<100 || m_nImageMag>200){



Tags: [電子工作]



[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2023 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/hardware/bsch3v_modify/