Free PCB (Special Build by Studio NAND)

 

スタジオ・ナンド版での主な改良と変更点 - Description about  improvements & changes

 

XPスタイルが適用された程度でプログラム実行時の外見上はほとんど変わりませんが、ソースコード全体にわたって、大幅に手を加えています。 以下は、主な変更内容です。 なお、現時点(2010/12)では、公式版の最新は「Ver. 1.359」ですが、スタジオ・ナンド版の最新は「Ver. 1.358」相当です。

 

○ 日本語リソースの追加 - Added resources of the dialogs and strings for Japanese language. (Don't worry, just be Bilingual)

 

現時点では、まだ全てのダイアログとメニューには対応していませんが、ダイアログとメニューの一部を日本語したリソースを追加しました。 差分パッチではなく、 独立した日本語リソースとしてソースコードに含まれており、、英語リソースと共存しています。 将来的には、リソースDLLとして独立させる予定です。(後述するように、開発途中 の現段階で分離すると確認作業が面倒になるため後回しです。)  なお、プログラムに埋め込まれた英語版リソースを直接書き換えている本家バージョン向けに公開されている日本語パッチは適用できませんし、パッチを適用する必要もありません。

 

○ リソースへのマニフェストファイルの埋め込みとXPスタイルの適用 - Add embedded manifest & supported XP style.

 

VC++コンパイラの各バージョン用に、ソリューションファイル(*.sln)とプロジェクトファイル(*.vcproj)を用意して、中間ファイルと実行ファイルをコンパイラの各バージョン毎に別ディレクトリに出力するようにしてあります。 また、Visual Studio 2005(VC++ 8.0)以降のサイド・バイ・サイドDLLに対応したマニフェストファイルの 自動埋め込みにも対応しています。 なお、XPスタイルを適用するので、新しいコモン・コントロール 6,0が必要です。  ファンクションキー部分の描画にXPテーマ用のシステムDLLを動的ロードせず、インポートライブラリをリンクして呼び出しているので、現バージョンはXP以降のOSでしか動きません。(近日中に動的リンクに変更します。)

 

○ Unicodeビルドへの対応 - Add ability to build both ANSI (MBCS) and Unicode.

 

WindowsのファイルシステムはUnicodeを採用しており、MBCS(シフトJIS)では全てのUnicode文字に対応することができないため、Unicode文字を含むフォルダやファイル名には対応できません。 MFCアプリケーションでは、あらかじめルールに従ってソースを記述しておきさえすれば、同一のソースコードからMBCS版のバイナリとUnicode版のバイナリを生成できるので、Unicode版のバイナリがビルドできるように、ソースを全面的に書き直しました。(※ 現段階では、コンパイルエラーとして検出されない文字列リソースが残っている可能性があるので、Unicode版のバイナリは くれぐれも自己責任でお使いください。)

 

○ プログラム起動時にアプリケーションエラーで落ちるバグの修正 - Fixed bugs application error in some PC H/W & S/W environment.

 

SDIアプリケーションを構成する主要なMFC派生クラス(CFreePcbApp, CFreePcbDoc, CFreePcbView, CFootprintView)のメンバ変数として、相互に依存関係を持つクラスオブジェクトへのポインタが定義されており、これらの初期化タイミングが、フレームワークの デフォルトの挙動に従っておらず、プログラムを実行するPC環境(CPU処理速度や同時実行している他のプロセスなど)によっては、フレームワークの内部処理によってオブジェクトの作成や初期化・関連付けが行われる前に、無効なポインタ を参照 してアクセス違反エラーを起こし、結果的にアプリケーションエラーが発生していました。 このため、これらのメンバ変数はすべて削除して、オブジェクトのポインタをフレームワーク関数経由で取得するように変更しました。

 

○ マウス左ボタンのダブルクリック操作による、編集ダイアログの呼び出しに一部対応 - Add double click action to edit easily

 

マウスのダブルクリックが使えなくて、WinBoardと比べて操作性がイマイチだったので、オリジナル版のソースコード「FreePcbView.cpp」をちょっと追って見ると、メッセージ通知ハンドラ(CFreePcbView::OnLButtonDblClk())が登録されているものの、「#if 0」でコメントアウトされており、とりあえず「#if 0」を外してみたらコンパイルエラーが出たので、元のコードは使わずにダブルクリックで実行したいポップアップメニューのメニューIDを調べて、PostMessage(WM_COMMAND,…)でメニューIDを投げるコードを追加しました。 すると、ダイアログの初期化中にアサートで落ちるので、ダイアログ側のコードにも少し手を入れたところ、うまく動いているようです。 現在のバージョンで、左ボタンのダブルクリックする ことができる対象と、ダブルクリック操作によって呼び出される機能は以下のとおりです。

 

ダブルクリックする対象
Double click target
操作の結果
Assigned actions
フットプリント(部品)
Footprint (part)
部品の移動
Start moving part
リファレンス(部品番号)テキスト
Reference (Component No.)
リファレンステキストのプロパティ
Show REF property dialog
配線補助線(ラッツネスト)
Rats nest
配線化
Change to trace
配線(セグメント)
Trace segment
頂点の追加
Add
vertex to the trace
基板外形の角
Corner of the board outline
外形線の角の移動
Start moving corner
基板外形の枠線
Trace
of the board outline
外形線の角を追加
Add
corner to board outline
銅ベタ領域の枠線
Outline of copper area
銅ベタ領域の追加/編集ダイアログ
Show area property dialog
部品のパッド(ネット接続あり)
Part pad (Net connected)
配線の開始
Start drawing trace
配線の頂点(ビアを含む)
Vertex
of the trace (Via pad)
頂点の移動
Start moving vertex (Via pad)
配線の終点
End vertex
of the trace
配線の追加
Start drawing trace

 

この改良により、いちいち右クリックでコンテキストメニューをポップアップしてメニューを選択するという煩雑さがなくなり、同一レイヤでのピン間配線作業については、以下の@〜A(ないしB)の繰り返し作業の連続で済むことになり、従来版に比べて、配線作業を大幅にスピードアップできると思います。

 

手順
Order
行う操作
Operations to edit PCB
操作の結果
Result of operation
補助線(ラッツネスト)のダブルクリック
Double click rats nest.
配線化(結線)
Rats nest has changed to trace
配線(セグメント)のダブルクリック
Double click trace segment
頂点の追加と配置
Start adding
vertex to the trace
配線の頂点(ビアを含む)のダブルクリック
Double click vertex of the trace
頂点の移動
Start moving vertex (Via pad)

 

○ IVEX WinBoardライブラリ(*.mod)のインポートに関するバグ修正 - Fixed bugs, related IVEX library importing.

 

全てではありませんが、とりあえずバグの挙動とソースの問題箇所を確認した以下のバグに対応しました。

 

(1) OUTLINE ARC の変換(第2象限と第4象限の円弧の処理が逆、また反時計廻りの円弧が無視される)

(2) MOUNTING の位置ずれ(Y軸オフセットの符号が逆)

(3) モジュール定義内(BEGIN〜END)内に記述された単位指定(UNITS)が無視される

(4) パッドスタック定義のインポート処理の改善(下記のような制限があるので、複数のパッド形状が定義されている場合、各レイヤへ最低1つの定義を取り込むようにした)

(5) REF以外無視されるのTEXT処理の改善(VALおよびダブルクォートで囲まれた任意のテキストを引き継ぐ。また、X,Y位置と文字高, シルク線幅の定義もMODファイルの値を使うようにした)  ただし、現時点ではテキスト文字列とその位置はインポートされますが、インポートによって生成されるFreePCBライブラリが持つフットプリント外形(モジュールが占有する領域)には反映していません。 FreePCBの仕様で、フットプリント外形線の外に配置されたテキストは、フットプリントライブラリでは編集できますが、ボード編集画面では移動・編集できないようです。

 

以下は、バグ修正前後のインポート結果を比較したものです。 サンプルデータは、「秋月電子通商」や「マルツパーツ館」等の店頭や通販でも取り扱われている、「NXP Semiconductors」社の「mbed LPC1768」用のフットパターンシンボルです。 Ivex WinBoard用ライブラリから変換して作成したFreePCB用ライブラリは、こちらのページからダウンロードできる、FreePCB用ライブラリのサンプルに収録されています。

 

修正前(Original version)のインポート結果 修正後(Bug-fixed version)のインポート結果

 

※ メタルゾーン(ベタの塗り潰し)の処理の方に問題(最初に定義されているパッドスタックのパッド情報に対してしかクリアランスを作らない)があって、必ずしも長所とは言いがたいのですが、WinBoardでは1つのピンの同じレイヤのパッドに対して、サイズや形状が異なる複数のパッド を重ね(スタックし)たり、それぞれ中心からのX, Yオフセットを指定してパッド定義できます。 一方、現在のバージョンのFreePCBでは、上(Top)、中(Inner)、下(bottom)の各レイヤに対して1つの形状のパッドしか定義することができず、WinBoardのライブラリをそのまま完全な状態ではFreePCBのライブラリには変換することができません。  以下は、WinBoard用ライブラリとして作成した、3mmΦの標準的な砲弾型のリード付きLEDと、表面実装タイプのLEDの兼用部品ライブラリです。 部品実装面[Top Side]のパッドは、リード部品用の丸ランドと、SMD部品用の矩形パッドを重ねて定義しています。 しかも、矩形パッドの中心は、リード中心(ドリル穴位置)からオフセットしています。 現行のFreePCBの部品ライブラリ仕様では、このようなパッドはどうやっても再現できません。

 

  

 

○ ライブラリ(*.fpl)からPDFファイルを作成する処理に関するバグ修正 - Fixed bugs, related creating PDF files. (#1)

 

部品外形線(シルク印刷等)の描画で、円弧の始点と終点が、「弦」のように直線で結ばれてしまうバグを修正しました。  修正前後のPDFファイル出力した例は以下の図のとおりです。 なお、サンプルに使った元データは、秋月電子で取り扱いの「基板実装タイプのCR2032ボタン電池用ホルダ」の資料から起こしたIvex WinBoard用ライブラリをFreePCBでインポートして自動作成したものです。 こちらのページからダウンロードできる、FreePCB用ライブラリのサンプルに収録されています。

 

修正前 (Original FreePCB) 修正後 (Bug Fixed)

 

○ ライブラリ(*.fpl)からPDFファイルを作成する処理のパッド重ね合わせ描画 - Fixed bugs, related creating PDF files. (#2)

 

部品面(Top side)と半田面(Bottom side)で大きさや形状の異なるパッドが登録されていても、PDF出力では、常に部品面(Top side)のパッドしか描画されなかったのを、リード付き部品(穴径が0ではない)については、半田面(Bottom side)→部品面(Top side)の順にパッドを重ねて描画することで、ガーバ出力と同様に、より実際に近いライブラリ画像がPDFファイルに出力されるように、改善しました。 修正前後のPDFファイル出力した例は以下の図のとおりです。

 

修正前 (Original FreePCB) 修正後 (Improved)

 

○ 内層レイヤ(L1〜L14)ガーバ出力をネガ反転するオプションを追加 - Added option to output negative for internal copper layers.

 

Tiny CAD / Free PCB 日本フォーラム」に書き込まれたトピックス『FreePCB 内層のガーバーについて』で取り上げられていた内容を見て、FreeePCBのプログラムで簡単に実装できそうに思えたので、試しに取り込んでみました。

 

ユーザ選択できるよう、CAM出力ダイアログに新たにオプション(チェックボックス)を追加してあります。 内層(L1〜L14)以外はネガ反転しません。 本家のFreePCBに添付のチュートリアル「motor.fpc」ファイルを読み込んで内層(L1)を出力した結果のガーバー表示は、以下の図のとおりです。 左が従来どおりに出力した場合で、右がネガ反転指定して出力した場合です。 画像をクリックすると拡大表示されます。 面付け指定した場合のガーバデータもちゃんとネガ反転して出力されます。  ネガ反転されるのは、基板外形線で囲まれたエリア内のみで、基板外形線の外側に配置される出力レイヤ名や、フィルム合わせマーク等については、通常のポジ出力した場合と変わりません。

 

 変更作業に要した時間は出力確認作業を含めて数時間ほどです。 ガーバコマンド自体が簡単にネガポジ反転できるような仕様になっており、当初思っ ていたよりも簡単でした。 公式版のオリジナルと比較してもらうと判りますが、 ソースの変更箇所は、ダイアログ廻りの追加などすべて含めて行数にして50〜60行くらいです。 ガーバ出力処理の大半は、「Gerber.cpp/Gerber.h」ファイル内に記述されています。

 

従来どおり出力した例
Output Inner layer gerber as same as previous.
ネガ反転オプション指定で出力した例
Output Inner layer gerber, with new NEG option.

 

このほか、CAMデータをファイル出力する際に、FreePCBは確認メッセージもなしで既存のファイルを上書きするので、デフォルトでは既存ファイルが存在している場合、上書きする前に確認のメッセージボックスを表示するように変更し、従来どおり確認しないで上書きするモードを選択できるチェックボックスを追加しました。 また、ファイル出力先のフォルダを、クリック一発でエクスプローラで開くことができるボタン等を追加しました。 数値入力のエディットボックスにスピンボタンも追加してありますが、現時点ではプログラムの動作に反映されておらず、機能しません。 以下は、日本語版のダイアログ画面(画像クリックで拡大表示)です。

 

 

 

○ クラスメンバの隠蔽と、表面上は変わらないコード修正

 

オリジナルのソースはC++で記述されていますが、ほとんどのクラスでオブジェクトメンバが外部から参照可能なpublicとして宣言されており、また、メンバ変数への直接参照や操作もプログラムのあちこちで行われており、とりあえず 片っ端からprotectedメンバに変更し、外部から参照されていてコンパイルエラーが出るメンバ変数だけpublicメンバに戻してあります。 また、メンバ変数の値を参照する既に定義されているのアクセス関数には、変更の手間が少なくて済むので、見つけ次第const宣言を付与し、関数内でメンバに変更を加えないことを明確化してあります。  また、デバッグ時にバグの検出が容易なよう、各所にASSERTマクロを埋め込んであります。

 


 


最終更新: 2010/12/11
記載の会社名、製品名は、それぞれの会社の商号、商標もしくは登録商標です。

Copyright (c) Studio NAND 2010. All rights Reserved.

Studio NAND