So-net無料ブログ作成
Altium VB Scripts ブログトップ
前の20件 | -

部品エリア内のREF番号の検出 Part.7 [Altium VB Scripts]

部品のシルク内にDesignatorのシルクを移動し忘れる場合をどう検出するかの話の続きで
何もなければこれが最終話です。

シルクに円を使用されている場合に対応しましたが、円弧は処理しないで無視することに
しました。

レポート形式での処理にシルクの向きの情報も追加しました。
メニューフォームも3番目のラジオボタン内にさらにラジオボタン群を設けることで
対応しています。
3番目のラジオボタンはシルクの向きのチェックの場合もレポートが必要なのでこういう
風になりました。
シルクへのデジグネータの被りはOverlapという項目とし、シルクの向きはAngleという項目に
してあります。
Angleは通常のTopの0/90度、Botの0/270度とその180度逆のモードのみをラジオボタンの切替で
対応させて、他の特殊な角度には対応していません。

タイトル、日付と時間、デジグネータでのソートもしています。

DRC_Util_Form_Result.png

nice!(0)  コメント(0) 

デジグネータの横幅 [Altium VB Scripts]

自作スクリプトでのシルクチェックの場合はデジグネータの文字列全体を四角形として処理し
ています。

サンセリフの場合は文字高の0.8倍ぐらいが横幅になっているので文字数を調べて掛ければ
文字列の横幅となります。
しかし、1だけ横幅が極端に狭くなるので計算通りの結果になりません。

これまでは面倒なのでこういったことには目を瞑って処理していました。
しかし、文字列の中から1がいくつ含まれているかを計算し、それを考慮した文字幅に処理が
できるでしょう。
1の場合の文字幅を0.7mmにするか0.75mmするかを悩みます。
またアルファベットとの組み合わせでプロポーショナルな動作をするので計算で処理するのは
難しそうです。


nice!(0)  コメント(0) 

部品エリア内のREF番号の検出 Part.6 [Altium VB Scripts]

部品のシルク内にDesignatorのシルクを移動し忘れる場合をどう検出するかの話の続きです。

シルクに円を使用されている場合はその中心と半径から左下と右上の座標を計算することで
処理しています。
レポート形式での処理も可能になりました。
しかし、円ではなくて円弧にはまだ対応できていません。

具体的に図で示すと、左側のように通常は問題ないのですが、右側の赤いラインを部品の外形と
認識してしまうのでU11がそのエリア内にあるということでエラーになってしまいます。

円弧の始まりと終わりを認識して円弧の左下、右上の座標を計算しないといけないので演算が
難しそうです。

Des_Rect_Pos6.png

Des_Rect_Pos6_2.png

nice!(1)  コメント(0) 

シルクの向きのチェック [Altium VB Scripts]

Designatorの向きは部品面の場合、通常は0度(360度)または90度とするのが一般的でしょう。
(半田面は0度と270度)
通常の製図で使用する向きに準拠するのがいいでしょう。

単体のスクリプトにすることも可能ですが、シルクエリア内にDesignatorが入り込んでいるかを
チェックするスクリプトも作成中なのでそれに機能を追加すれば良さそうです。

面付けの都合で天地を逆にしたい場合もあるようなのでそれもUpshide downのモードとして
設ける必要があります。
(通常の基板のシルクのまま、基板全体を180度逆にしたような状態です。)

レポートのエラーの項目を増やしたり、ラジオボタンの表示/非表示の修正などプログラミングは
ややこしくなりますが可能でしょう。

VB_Scr_SilkTBN.png


nice!(0)  コメント(0) 

部品エリア内のREF番号の検出 Part.5 [Altium VB Scripts]

部品のシルク内にDesignatorのシルクを移動し忘れる場合をどう検出するかの話の続きです。

シルクレイヤのトラックばかりに注目していましたが、ディスクリートの電解コンデンサなど
円弧の場合もあります。
そこでトラックと円弧の両方で最小、最大値を計算する必要が出てきました。

最初にトラックだけでプログラミングして後から円弧も足せるような手法でプログラミング中です。

スクリプト自体はある程度は動作していますが、まだエラーリスト化のプログラミングまでは
到達していません。

Des_Rect_Pos5.png
nice!(0)  コメント(0) 

Script内の文字列ソート [Altium VB Scripts]

Delphiでは集計した文字列をソートすることが可能です。
しかし、Delphiで利用できる関数にsortは入っていませんでした。
VBの方も調べてみましたが同じくsortの記載はありませんでした。

VBスクリプトで実際にsortを使用してみると動作しました。
次にInsertも利用したいのですが、こちらは頭にCallをつけないと動作しませんでした。

つまりDocumentという文字列の場合は下記のようにします。
Document.Sort
Call Document.Insert(0,"ABC" )
Call Document.Insert(1,"DEF" )
Call Document.Insert(2,"GHI" )


nice!(1)  コメント(0) 

VBスクリプトでの文字修正 [Altium VB Scripts]

Altiumのスクリプト内で尚且つVBスクリプトでは制限が多くあります。
Dimの後にasを指定するとエラーになります。

そんな訳で大文字小文字の修正はないと思っていたらUcase、Lcaseがそれでした。
一般的にはUpperCase、LowerCaseと呼ばれているので気がつきませんでした。

VBAを含めても知らなかったのが「StrReverse」という関数です。
これはABCという文字列ならばCBA
というように逆する関数です。

WeekdayName関数では曜日が日本語で表示されますが
画面上では文字化けします。
英語のままがいいのですが、修正するのはAltiumのVBの場合は面倒なので止めています。


nice!(0)  コメント(0) 

Space関数の使用 [Altium VB Scripts]

VBAのスクリプトにてTAB区切りでは画面上でのレポートファイルでは見辛いのです。
そこで文字数を調整した方が便利です。

その時に利用できそうなのがSpace関数です。
Space(10) とすれば半角スペースを10個分を挿入することになります。

長いフットプリント名などは文字数を事前にLen関数で数えて調整する必要があります。
例えば40文字に固定するならば文字数から逆算した数値をSpace関数に入れて列を揃えることに
なります。

ただ、引き算をしてマイナスになった場合はエラーになるので注意が必要です。
ABS関数でマイナスにならないようにできますが、列が上手く揃わなくなります。

自社のフットプリントであれば文字数は想定できますが、会社によってはプリフィックス
サフィックスを足して長い文字列で管理されている場合があります。

Space_Sample.png

nice!(1)  コメント(0) 

AltiumのVBスクリプトのForm [Altium VB Scripts]

まだ記事にしていないようなのでフォームありのVBについて記載しておきます。
見本となるスクリプトの殆どがDelphiでさらにVBでフォームを使用したものが
見つかりませんでした。
こういう風にすると動作しました。

基本となるMainというスクリプト内でフォームであるForm1をShowで表示します。
最後のチャンセルボタンButton2などでCloseします。

フォームの話には関係ありませんがOKボタンなどのButton1でスクリプトを動作させる
プログラムを記述します。
そのボタンをClickすれば動作するという意味です。

Sub Main ()
Form1.Show
End Sub
:
:
:
Sub Button1Click(Sender)
動作用プログラム
End Sub
:
:
:
Sub Button2Click(Sender)
Form1.Close
End Sub


nice!(0)  コメント(0) 

部品エリア内のREF番号の検出 Part.4 [Altium VB Scripts]

部品のシルク内にDesignatorのシルクを移動し忘れる場合をどう検出するかの話の続きです。
デジグネータのシルクを四角形としてスクリプトで処理しようと考えています。

最小値である左下のXY座標と最大値である右上のXY座標から四角形として認識すればいいと
最初は考えていましたがそれだと一部分が掛かっている場合が組み合わせによっては検出できません。
そこで四角形としたシルクの四隅を左下からABCDとして座標を計算させています。

配置された部品自体はシルクなどのトラックの数値を個別にチェックして同様に四角形と
して認識させます。
その数値内に四隅のシルクの座標が入っていたらエラーとしてレポートすればいいという考え方です。

デジグネータの座標と文字高で計算しますが、座標は部品面の場合は左下の数値です。
また角度によって最小最大値とは違うので処理する必要があります。
シルクが0度(水平の場合)では、文字高の0.8倍と文字数を掛け合わせたものが横幅と推測します。
(0.8倍というのは、サンセリフの場合の複数の文字から計算した平均値です。)

つまり、文字高が1mmでR100というシルクであれば文字数が4個なので1(mm) x 0.8 x 4 = 3.2(mm)
左下のXY座標が、もし0、0であれば右上は3.2、1(文字高そのもの)という意味です。

半田面の場合はX座標が反転されるので角度との絡みで複雑になります。
その場合も部品面視で処理します。

Des_Rect_Pos4.png

nice!(1)  コメント(0) 

部品エリア内のREF番号の検出 Part.3 [Altium VB Scripts]

部品のシルク内にDesignatorのシルクを移動し忘れる場合をどう検出するかの話の続きです。

バッドに掛かったデジグネータのチェックはクエリーで可能ですが、単純に
QFPなどの部品の内側のシルク内にあるデジグネータは距離が大きいのでクリアランスで
指定できずDRCエラーとして上がってきません。

クリアランスチェックではシルクやメカニカルレイヤをクエリーで指定できたとしても
電気的な要素ではないので弾かれてしまいます。

そこでシルクのライン(トラック)をスクリプトで部品ごとに調べて最小のXY座標と
最大のXY座標を調べてその占有エリアとし、それとデジグネータの左下の座標から推察した
エリアがその占有エリア内にあればエラーとなるのではないかというアルゴリズムです。

SMDに対応したピックアンドプレーススクリプト(海外サイト)を検討しているとシルクで使用して
いるトラックの座標を検出することが可能なのでこの案も現実的になってきました。
(残念ながらこの海外のスクリプトは入手できないようです。SCHリンクのデジグネータと
コメントを利用しているのが難点だと思っていました。弊社ではそれを改善しました。)

CRを非表示し手動でチェックするスクリプトとこのスクリプトを同じメニュー(フォーム)で
作成中なので出来上がるまではリリースできそうもありません。


nice!(0)  コメント(0) 

部品エリア内のREF番号の検出 Part.2 [Altium VB Scripts]

プログラミングではなくて手動でチェックする場合も検討してみました。
DRCでチェックできる2012以下のシルクのデジグネータだけ非表示にすればいいのではないかと
いう案を思いつきました。
そうすれば大物だけが表示されるのでそれを目でチェックすればいいということです。

そこで登場するのがスクリプトで特定のデジグネータだけを非表示するというプロセスです。
CRだけを非表示にするとチップアルミ電解コンデンサやチップタンタルコンデンサや
R3216以上の抵抗も非表示になってしまいます。

まず、CRだけというのはDesignatorの最初のアルファベットを検出して二番目が数字ならOKです。
次に大きな部品は高さ情報で制限すれば良さそうですが高さを記載していないとNGです。
そこで思いついたのがパッドサイズを判定するということです。
パッドのXYサイズの内どちらか大きい方を判定してそれが2mm未満なら非表示としています。

PX、PYのサイズということでチェックしてそれをミリにします。
PXsize = CoordToMMs(Pad.TopXsize)
PYsize = CoordToMMs(Pad.TopYsize)

しかし、ディスクリートのCRはパッドが1.4-1.6mmぐらいですから非表示になってしまいます。
そこでパッドがMultilayerの場合はディスクリート部品と判定してSMDは非表示にしますが
ディスクリート部品は表示することにしました。
その判定方法は下記のようにします。最初にSMDとしておいてIF文でチェックしてディスクリートなら
Falseにする方が2行で済みます。

SMD_Comp = "True"
If Pad.Layer = eMultilayer then SMD_Comp = "False"

最後にIF文でCRかどうか、パッドサイズの制限とSMDかどうかどうかで判定します。

全表示させる場合に認識マークなどを部品として処理している場合は表示されてしまうのが
難点です。
放熱器などの機構部品も同様です。


nice!(0)  コメント(0) 

Edit Propertyのスクリプト [Altium VB Scripts]

前出の部品のプロパティを編集するスクリプトでユニークIDだけを独立させた
ラジオボタンに修正しました。

まだ、ストロークフォントの指定などもスクリプトで厳密に指定が可能になったので
その部分も指定しておきました。

コメント欄などは使用しない場合もありますが、デフォルトではなく予め指定して
おいた方がいいと考えて処理しています。

他のスクリプトでもストロークフォントをサンセリフに指定してあります。
TTフォントでは文字高を指定しても違うサイズになるのでこのことは重要です。

Edit_Prop_Menu2.png




nice!(0)  コメント(0) 

スクリプト内でデジグネータなどの非表示 [Altium VB Scripts]

基板上のDesignatorやCommentなどを非表示したいことも稀にあるでしょう。
基板上に配置した部品をComponentとすると
Designatorを表示、非表示するには下記のようにします。

Component.NameOn = True
Component.NameOn = False

同様にCommentを表示、非表示するには

Component.CommentOn = True
Component.CommentOn = False

となります。

DesignatorやCommentなどを非表示にするなんてと思っていらっしゃる方もおられる
でしょうがそうでもないのです。
その話は今後の記事にて。


nice!(1)  コメント(0) 

シルクの文字を修正 [Altium VB Scripts]

文字を45度回転するスクリプトなどを加工すると文字を一括編集するプログラムに変更が
可能です。

ストロークフォントの指定方法も見つかったので下記のように処理することができます。

種類のラジオボタン
1.デフォルト
2.サンセリフ
3.セリフ
4.TTF(Arialなど)

サイズのラジオボタンまたは入力ボックス
1.文字高
2.太さ

デジグネータとコメントの選択ボタン
1.デジグネータのみ
2.コメントのみ
3.両者を変更

配置レイヤ、ポジション、HIDEオン/オフ

ざっと思いつくのはこれぐらいです。


nice!(0)  コメント(0) 

2つのスクリプトを合成 [Altium VB Scripts]

部品のプロパティを編集するスクリプトと部品の座標を丸めるスクリプトを合体させて
一つのメニューフォームで処理することにしました。

詳しくは下記のブログ記事の機能です。
1.SCHのREF番号の修正
2.コメント欄の空にするスクリプト
3.部品の座標の丸めをするスクリプト

どちらのスクリプトもパターン設計後ではなく、ラフレイアウト後やパターンを引き始める
時に利用することを想定しています。

部品の座標を丸めるのはデフォルトを0.001mmにしているとはいえ、危険なのでチェックボタンを
オンにしないと利用可能にならないような仕様にしてあります。

メニューフォーム内には記載はありませんが、部品の回転角度は360度を無条件に0度に修正します。
これでピックアンドプレースファイルの出力時に顧客からつっこみが入らなくなるでしょう。
併せてプリミティブロックのロックし忘れ防止のために再ロックを無条件に掛けます。

左側のプロパティ修正欄はわかりやすいように項目名を規則的にしてあります。
デフォルトはSCHリンク用のデジグネーターをフットプリントのデジグネーターと同じにするものに
してあるので誤って操作させても支障はないでしょう。

このスクリプトは時期を見てダウンロードできるようにしたいと思います。

Edit_Prop_Menu.png

nice!(0)  コメント(0) 

部品のプリミティブのロック [Altium VB Scripts]

スクリプト内の部品をComponentとすれば
下記の記述でプリミティブロックが外れます。

Component.PrimitiveLock = false

これでは使い勝手が悪いのでロックし忘れを防ぐ為に
下記のようにする方が安全でしょう。

Component.PrimitiveLock = True

詳しくはこちらの情報を参考にしてください。

http://wiki.altium.com/plugins/viewsource/viewpagesrc.action?pageId=3899914



nice!(0)  コメント(0) 

部品の座標の丸めをするスクリプト [Altium VB Scripts]

前出の能動的なスクリプトの案として提案した記事の内容を実現しました。

基板上の部品のブロック移動などを重ねるとその座標がグリッドから少しだけ外れます。
インチ/ミリの計算の誤差なのかもしれません。

それを修正するスクリプトが完成しました。
プログラミング内では四捨五入という概念はないので丸めというRound関数を使用します。
四は切り捨てしても問題ありませんが、五は1~9の真ん中なので1/2の確率で切り捨て切り上げを
しないといけないからです。

メニュー付のスクリプトとして丸める桁を小数第0から3位までにしました。
ミリ系なので1mm、0.1mm、0.01mm、0.001mmの4つの中から選べます。
デフォルトは0.001mmにしてあります。

併せて部品の回転角度が360度の場合は、0度に修正するようにしています。

設計完了してから移動するとまずいのでラフレイアウトが完了した時点、またはパターン配置
直前に使用するといいでしょう。
ピックアンドプレースファイルで出力時の座標を丸めるスクリプトも用意しているので
気にせずにそのスクリプトで処理する方がいいかもしれません。


nice!(0)  コメント(0) 

シルクの文字を45度回転するには Part.7 [Altium VB Scripts]

スクリプトはほぼ完成したと思っていましたが、別の案が浮かびました。
現状では別名保存して処理しています。
面倒な場合もあるでしょうからデジグネータを移動するのではなく別のレイヤにコピーするという
処理であれば利用しやすいでしょう。

例えばシルクレイヤのTOP/BOT用のそれに対応したものとしてメカニカルレイヤの11-12などに
配置するということです。

これまでのように作業が可能なのか、メニューフォームがこれまでのものと互換性を持ちながら
機能追加できるかどうかを検討中です。

個々にスペシャルストリングスを配置しても部品配置後でフットプリント内に無い情報なので
表示されません。
単純にテキストとして配置することは可能です。
どちらにしても部品を移動すると連動はしていないので文字が取り残されます。

コメント欄の文字をデジグネーターと同じ文字にして別のレイヤに配置することは可能です。
これであれば部品と連動しているので移動時に文字が取り残されることはありません。
しかし、すでにコメント欄の文字を型番名などとしてガーバーデータとして利用する場合は
NGです。
別名保存してマウント図として利用する分には問題ないでしょう。


nice!(1)  コメント(0) 

スクリプト内でフォントを変更 [Altium VB Scripts]

スクリプトでフォントの高さや太さを変更していますが、これまでは設定されたフォントの
高さや太さを変えているだけでフォント自体は変更していませんでした。
TTFは設定は可能なのですがストロークフォントにすることが探してもどれなのか不明だったからです。

配置した部品をComponentとすると

Component.Comment.UseTTFonts = False

これで逆説的にストロークフォントになることがわかりました。

また、それらしいFontNameはTTF用のようで、駄目でFontIDで指定するようです。
Default、Sans Serif、Serifがそれぞれ1、2、3 に対応していました。

Sans Serifで文字高1mmで太さを0.2mmとするには下記のようになります。

Component.comment.FontID = 2
Component.Comment.Size = MMstocoord(1)
Component.Comment.Width = MMstocoord(0.2)

これで基板上に配置した部品のプロパティ画面の中でわからないものはほぼ無くなりました。
スクリプト作りで疑問があると困るのですが、これですっきりしました。


nice!(1)  コメント(0) 
前の20件 | - Altium VB Scripts ブログトップ