PythonでiCADを操る 2023/11/22

公開スクリプト集 を作成しました。最新版はこちらから。
SDK+ Tips集 を作成しました。少しづつ充実させる予定です。

目次

用意するもの プログラム開発の小技 その1 スクリプトの共通部分の解説 現モデルを削除するPython Script ボルトを配置するPython Script(2019/12/20)(20/7/6 Ver.1.10) icdモデルの諸情報を一覧するPython Script(2019/12/30) sxnetの各クラスのメソドやメンバーを一覧するには(2020/3/6) 部品図の寸法編集スクリプト(2020/3/12, 2020/5/30改名) DXF変換した2D図面から部品図の諸元を読み取ってパーツ付加情報に転記するスクリプト(2020/3/25) DXF変換したカム曲線をモデリングするための補助スクリプト(2020/7/25) カタログデータを一括インポートするスクリプト(2020/7/26) 揺動グリッパーのカム(円盤板カム)の作図スクリプト(2020/8/23) 「ファイルを開く」補助メニュースクリプト(2020/11/28) 円筒板カム作成スクリプト(2020/11/28) 円筒カバーの展開図作成補助Script & 穴中心線作図Script (2023/08/24)

はじめに

  iCADには「SDK+」という「コマンド開発機能」がオプションで提供されています。
  VBAマクロよりは強力で、ほとんどのiCAD要素や情報を設定、把握、操作できるようです。 
  標準の開発言語は「Visual Basic」と「C#」なので、サンプルコードも両方が揃っています。
  ところが、Pythonでも開発することができそうなのが分かったので、いろいろ試しているところです。
  せっかくなので、当サイトでその過程を公開し仲間が増えてくれれば幸いです。

用意するもの

  1.「SDK+」の「開発権と「実行権」が必要です。使うだけなら「実行権」があればいいようです。(iCAD社から購入)
      「実行権」には「ローカル版」と「ネットワークライセンス版」があります。お使いのiCADに合わせて購入してください。
      当社では「ネットワークライセンス版」を使用してます。
      購入後、サポートセンターに「登録番号(マックアドレス)」を連絡すると、パスワードがすぐに送られてきます。
      「iCADSXライセンスツール」「パスワード登録」をクリックして、ライセンスを取得します。

  2. スタートメニューの iCAD SX環境設定ツールから「.NET連携セットアップ」を起動し、設定を行ってください。
       また、ネットワークライセンス版の場合は「iCAD SXライセンスツール」から「製品タイプ登録」で
      「SDK+ランタイムライセンス」 にチェックを入れてください。

  3.Pythonをインストールします。
      Pythonの公式サイト https://www.python.org/downloads/windows/ よりwindowsのbitに合わせて
        64bit   windows x86-64 excutable installer
        32bit   windows x86 excutable installer
      をダウンロードして、インストールしてください。
      尚、デフォルトの保存先が
        c:\users\acad\AppData\Local\Programs\Python\Python37
      となります。これだと、後々面倒だったの(pathを通すときなど)当社では
        c:\online\Python37
      にインストールしてます。

      ※注意[2020.5.30追記] Python3.8だとpythonnetが構築できないようです。 Python3.7なら大丈夫です。
        また、インストール時に「Pythonにパスを通す」(だったかな?)にチェックをいれましょう。

  4.pythonnetをインストールします。これがないと、.NETとの連携ができないようです。
      Powershellもしくはコマンドプロンプトを起動して、pip でpythonnet をインストールします。
        [Pythonインストールフォルダー]\Script\pip install pythonnet       
とキーインしてください。(環境変数のパスを通せばパスの指定は不要です) 赤い文字で叱られたら、パスが間違ってる可能性が高いです。 [2020/5/30追記]
      pip install pythonnet
もしくは
      py -m pip install pythonnet (pipにパスが通っていないとこちら。おそらく)
※ インストール先の確認 コマンドプロンプトもしくはPowerShellよりPythonを起動して
            >> import sys
            >> sys.path
と入力すると、インストール先をフルパスで表示せてくれます。 5.c:\ICADSX\bin\sxnet.dllをPythonのインストールフォルダー(c:\online\Python37) にコピーします。 ファイルサーバーを利用していてPython Scriptを共有する場合はPython Scriptの保存フォルダーに コピーしてもいいようです。当社では x:\script\python\ に保存してます。 また、パスの設定は環境変数PYTHONPATHに c:\ICADSX\bin を設定すれば大丈夫そうです。(確かめていませんが) 以上で準備完了です。Visual Studioに頼らなくてもiCADを操れるって、ちょっとうれしくありませんか? とりあえずはiCADを操作する上での「ちょっと便利なツール」を開発しようと思いますが、いずれはUnivarsal Cam曲線を 使って、iCAD上でカム曲線に沿って開閉動作するグリッパなんかも作図したいと思っています。

プログラム開発の小技 その1

 SDK+(sxnet)をインストールすると

 1.ヘルプ  c:\ICADSX\HELP\sxnet.chm
 2.サンプル  c:\ICADSX\ETC\sxnet\sample\....

 が追加されます。(※注意 「これらは「開発権」を購入しないと入手できないそうです)
 このサンプルコードから文字列を検索できると便利です。
 サンプルコードはVisual BasicとC#なのですが、sxnetモジュールにどんなクラスや
 メソドがあるかを知ることができ、Pythonプログラムの開発でも役に立ちます。
 Powershellよりc:\ICADSX\ETC\sxnet\sample\C# に移動した上で
    PS> findstr /S "要素" *cs

と入力するとC#のサンプルコードより、"要素"という文字を含む行の全てを表示してくれます。

起動方法

1.コマンドプロンプトもしくはPowerShellを立ち上げ
    PS> py [python script保存ホルダー]\[python Script]

  と入力します。例えば、当社では
    py x:\script\python\icd_cur_mdl_del.py3
  といった感じになります。
  拡張子が「.py3」となっているのは、python 2.x系を3.x系を区別するためで、当社の都合によるものです。

2.iCADのメニューに埋め込む方法を「現モデル削除script」「icd_cur_mdl_del.py3」を例に説明します。
  「iCADSX環境設定ツール」「メニューセットアップ」を起動し、例えば「メニューバー」の「マクロ」メニューを開いて
  「コマンド一覧」から適当なコマンドを選択し「追加」をクリックします。  新たにコマンドが追加されるので、
      「名称」に「現モデル削除」
      「コマンド」に「;EXEC /py x:\script\python\icd_cur_mdl_del.py3/ @GO」
  と編集し直します。
  iCADを再起動すると新たなコマンドがメニューに追加されます。
  「メニューバー」以外にも「ツールバー」や「ショートカットキー」にも登録できますが、「コマンド」の部分は共通です。

スクリプトの共通部分の解説

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import clr                  # .NETをimport   
clr.AddReference('sxnet')   # iCAD操作
from sxnet import SxSys     # SxSysクラスをimport
from sxnet import SxFileModel # SxFileModelクラスをimport
SxSys.init(3999)

1,2行目がないと、「clr」や「numpy」がインポートできないようです。 ※ [2020.1.14追記] 1行目は「shebang」と言ってUnix系のOSの場合にPythonの起動を司るおまじないのようです。 ただ、windowsでも環境によっては必要なケースがあるらしく、当社でも「アナコンダ」をインストールしたマシンと   標準のPythonをインストールしたマシンで挙動に違いが見受けられました。 整理できてないのですが、スクリプトが起動しない場合は #!/usr/bin/env python3 #!/usr/bin/env python 未記入 のどれかで試してみてください。 3,4行目はインストールしたpythonnetから「.NET」をインポートして、iCADを操るためのクラスライブラリー「sxnet」 を参照できるようにすためのコードです。 5,6行目で必要なクラスをsxnetよりimportします。 from sxnet import * で全てのクラスをインポートできます。 7行目はiCADと通信するポート番号3999を指定しています。 この番号は「iCADSX環境設定ツール」「.NET連携セットアップ」設定したポート番号を記述します。 デフォルトが「3999」なので、おそらくこの値で設定されているはずです。 尚、当社のスクリプトはLinux環境で開発しているため、全て文字コードに「UTF8」を使用しています。 お使いのエディターで文字化けが起こるようでしたら、対処願います。

現モデルを削除するPython Script :: icd_cur_mdl_del.py3

  iCADを使っていて「ファイル名を変更したい」ということや「このファイルいらないなー」ということがたまにあります。
  エクスプローラを起動して削除すればいいのですが、間違えて消すことが度々あります。(私だけ?)
  データの中身を確認しながらファイルを削除できるのがこのスクリプトです。
  実際には、削除するわけではなく「c:\iCADSX\gomi\」フォルダーに移動してくれます。
  事前に「gomi」フォルダーを作成しておいてください。たまには掃除(削除)することをおすすめします。
  
#! /usr/bin/env python
# -*- coding: utf-8 -*-

#  icd_cur_mdl_del.py3    2019.10.2  kita
#  現在アクティブとなっているモデルファイルを削除(c:\IACDSX\GOMIへ移動)する

# 起動方法
# py icd_cur_mdl_del.py3

# 参考  C#_sample\SxFile/Sxfile/SxFile.cs

import clr                      # 必要なアセンブリを読み込み,.NETの名前空間をPythonのパッケージとしてimportして扱う
clr.AddReference('sxnet')       # iCAD操作用クラスのdllをimport
from sxnet import SxSys         # iCAD/SXSystemオブジェクト
from sxnet import SxFileModel   # iCAD/SXファイルのオブジェクト
import sys                      # PythonのSystemライブラリー
import os                       # osコマンド用ライブラリー
import shutil                   # ファイル操作ライブラリー
import time                     # 時間、sleep用ライブラリー

SxSys.init(3999)                # iCADSXとの通信用Port3999番を初期化 

move_fld = 'c:\\ICADSX\\gomi\\' # 移動Folder

# システム情報取得
inf_sys = SxSys.getInf()

# アクティブ図面(モデル)の取得
model = inf_sys.active_model

# 図面(モデル)ファイルを開く
inf_model = model.getInf()

# ICAD/SXファイルのオブジェクト作成
try:
  sxfile = SxFileModel(inf_model.path, inf_model.name+".icd")
except:
  input('iCAD Fileファイルが開かれていないか、削除済みです。')
  sys.exit()

full_path_fn = sxfile.getFullPath()

menu = input(full_path_fn + 'を' + move_fld + 'へ移動しますか(y/n):')
if menu == 'y':
 shutil.move(full_path_fn,(move_fld + inf_model.name + '.icd'))    # File名も指定すると上書き
 input('\n' + full_path_fn + 'を' + move_fld + 'へ移動しましました。(Key In!)')

else:
  input('\n' + full_path_fn + 'の移動を取りやめました')

ボルトを配置するPython Script(2019/12/20)(2020/7//6改) :: icd_bolt_setJ.zip

本スクリプトの動画 icd_bolt_set.mp4

  キリ穴部品とタップ部品のエッジを選択すると、自動でボルトを配置してくれるスクリプトです。
  「キリ穴」「ざぐり穴」「タップ」に「穴属性」が付いていないと動作しません。(認識してくれません)
 パラソリッドから変換して生成された穴等にはこの「穴属性」が付加されていないので、空け直す必要があります。
  それでも、穴サイズや深さを測定してボルトを選定する手間が省けて助かります。
  ボルトはiCADSXが標準で装備しているボルトを配置するようになってますが、各社で作成したボルトがあるようでしたら、
  icd_bolt_setJ.ini ファイルを編集して読み込むボルトを変更してください。
  スクリプトはかなり長文なので、ここに掲載しませんでした。「cd_bolt_setJ.zip」をダウンロードしてください。
  使い方等は icd_bolt_set.txt に記載してあります。

 大変だったのは傾いた部品へのボルト配置で、牧野洋先生の「自動機械機構学」「空間ベクトル」を勉強しなおす必要がありました。
  「Eのjθ」という「回転変換テンソル」が「my_vector.py」の中に入ってます。

  ※[2020/5/30追記]   このスクリプトを走らせるとタップやキリ穴配置の際に「穴属性」のチェックが外れてしまします。
    iCAD社に問い合わせたところ「バグです」とのことでした。手動でチェックを入れなおしてください。

  ※[2020/7/6 Ver.1.19] メニューをTkinterを使ってGUI化しました。
              「共締め部品」の厚み指示を省略しました(アルゴリズムを変更。K200703.pdf参照)
              ボルトデーターの読み込み先設定ファイルを引数渡しに変更しました。例えば
                  py icd_bolt_set.py3 icd_bolt_setJ.ini 
                

icdモデルの諸情報を一覧するPython Script(2019/12/30) :: icd_icd_ext.zip

 iCSDで作業していて、特定のフォルダーのicdモデルのパーツ名(図番)やパーツコメント(品名)、パーツ付加情報
 を一覧表示したいことがあります。
 それを実現してくれるのが、このスクリプトです。
 引数にターゲットフォルダーと表示モードを渡してください。

# 使用例
 py icd_icd_ext.py3 c:\my_files\test 1
     引数 0:各ファイルの情報を順次表示
     引数 1:一覧表示

# スクリプトの説明
 このスクリプトは「sxnet」を使用していないので、iCADが起動している必要はありません。
 iCADを起動して諸情報を得るスクリプトも作成したのですが、モデルを読み込むのに時間がかかってしまいイマイチ
 だったので、直接バイナリーデータから抽出することにしました。
 そのかわりに、パーツ付加情報で取得できるのは「User_type」と「User_MCMCD」(メーカーコード)
 だけです。

.icdモデルの要素、エッジ、フェイスをピックして情報を取得するサンプル(2020/1/20) ::SxSys_Select.zip


 sxnetのC#サンプルコード(SxSys\Select\Select.cs)をPython風に書き直したサンプルスクリプトです。

1.サンプルデータを読み込まなくてもアクティブ画面にアクセスできるように
    アレンジしてあります。
2.while loop を使って、連続して要素(エッジ、ファイス)をクリックできるように
    しました。
3.face選択時に面の中心座標を表示するようにしました。
4.で終了します。


ソースコードを以下に記載します。

#! /usr/bin/env python3
# -*- coding: utf-8 -*-

# 元サンプル    SxSys\Select\Select.cs
#   SxOptSelect()の使用例
#   .icdモデルの要素、エッジ、フェイスをピックして情報を取得するサンプル

import clr
clr.AddReference('sxnet')
from sxnet import *


# 通信初期化
SxSys.init(3999);

# モデルを開く。なければアクティブ画面が対象
try:
  file = SxFileModel(SxSys.getDir() + r"\ETC\SXNET\SAMPLE\MMF\MODELS","TEST-PART.icd" );
  model = SxModel.getModel( file.getDir(), file.getFileNameNoExt() )
  if model == None:
    model = file.open(True)
    model.setActive()
except:
  print('icdモデルが不在です')  

# ENT/POS/@GO待ちの実行
opt = SxOptSelect()
opt.ent_mode = SxSys.ENTMODE_MULTI
opt.select_ent = True
opt.select_pos = True
opt.select_go = True
opt.select_edge = True; # エッジ選択を有効にするには、この行のコメントを外す。
opt.select_face = True; # フェイス選択を有効にするには、この行のコメントを外す。
opt.text = "要素/座標/@GO のいずれかを入力して下さい。(GOで終了)"


#実行結果の表示
loop = True
while loop:
  print('\n' + opt.text)  
  inf = SxSys.select(opt)
  if inf == None:
    print("\n処理途中でコマンドがキャンセルされました。")
  else: 
    if inf.status == SxInfSelect.STATUS_GO:
      print("\n@GO(マウス右ボタン)が入力されました。終了しました。")
      break  

    elif inf.status == SxInfSelect.STATUS_ENT:
      einf = inf.ent.getInf()
      print("\n要素が選択されました。")
      print("要素のタイプ:{0}".format(einf.type))
    

    elif inf.status == SxInfSelect.STATUS_POS:
      print("\n座標が入力されました。({0},{1},{2})".format(inf.pos.x, inf.pos.y, inf.pos.z))
      if SxSys.getInf().active_wf != None:
        SxEntSeg.createPoint3D(inf.pos)
      else:
        SxEntSeg.createPoint2D(inf.pos)
      

    elif inf.status == SxInfSelect.STATUS_FACE:
      geom = inf.face.getGeom()
      print("\nフェイスが選択されました。")
      print("ジオメトリタイプ:{0} {1} {2} {3}".format(geom.type, geom.cs.org.x,geom.cs.org.y,geom.cs.org.z))
      # faceのタイプ、平面中心座標を表示

    elif inf.status == SxInfSelect.STATUS_EDGE:
      geom = inf.edge.getGeom()
      print("\nエッジが選択されました。")
      print("ジオメトリタイプ:{0}".format(geom.type))

将来的には取得した面情報からスタッドボルトの配置情報を取得して自動でナットを配置できるようにする予定です。 乞うご期待!

sxnetの各クラスのメソドやメンバーを一覧するには(2020/3/6)

 sxnetにはクラスが山のようにあって各クラスの使い方をヘルプ(sxnet.chm)やサンプルプログラムから読み解く
という作業が「iCADを操る」プログラミングのほとんどの作業になります。
 先週末に発見したのですが、dir 関数を使うことで各クラスのメソドやメンバー変数を一覧することができます。

#! /usr/bin/env python3
# -*- coding: utf-8 -*-

# sxnetの各クラスのメソッド、メンバー変数を一覧する


# 起動方法
# py icd_ml.py [クラスオブジェクト}
#
import clr
clr.AddReference('sxnet')
from sxnet import *
import sys

SxSys.init(3999)

#for x in dir(SxGeomText):       # 文字列
#for x in dir(SxGeomLengthDim):  # 直線寸法   
#for x in dir(SxGeomLabel):      # 注記
#for x in dir(SxWindow):       # iCAD画面に表示されている画面の数 F4で表示される数
#for x in dir(SxModel):       # CAD Model 
#for x in dir(SxVs.getInf):    # 2D空間のView 情報
#for x in dir(SxVS):           # 2D空間のView 
for x in dir(SxInfVS):         # 2D空間のView  angle comment cs name org scale type view_type
  print(x)

 最初はクラス名をdir関数へ引き数渡しできないかやってみたのですが、無理でした。

部品図の寸法編集スクリプト(2020/5/30)::icd_dim_edit.zip

  この間、部品図の出図に追われて、ご無沙汰してしまいました。
 部品図を作成していて気付いたのですが、寸法の編集って結構面倒ですね。
 そこで、寸法の編集をサポートしてくれるスクリプトを作成しました。
  各会社で製図方法に特徴やクセがあって、デフォルト文字を変更したくなると思いますが、Pythonならソースコードをすぐに編集
 できるので便利です。
 今回は「tkinter」というGUIモジュールを使用して、Windowsライクに仕上がっています。
 やっぱり、このほうが使い勝手がいいですね。残念ながら。

  [2020/5/30] 「icd_add_word_menu.py」 を「icd_dim_edit.py」に改名し機能も追加しました。

DXF変換した2D図面から部品図の諸元を読み取ってパーツ付加情報に転記するスクリプト(2020/3/25)::icd_dxf2buhinzu.zip

  トップダウン設計がiCADの醍醐味だとは思うのですが、2D Cadの資産がたくさんある場合は、2DCadの部品図をiCAD Dataにモデリングする機会が結構あります。
  当社ではAdvance CAD(以下Acad)いう2D Cadを使用しており、このCadは結構強力なマクロ機能を備えています。
  モデリングの作業は以下のような流れで実施してます。

  1.変換したい部品図ファイル(拡張子.MDL)を所定のフォルダーにコピーする。
  2.AcadよりMDL2DXF.MAC(Advance CADマクロ)を起動し、一括してDXF Fileに変換して所定のフォルダーに保存する。
      この際、品名、材質、熱処理、図面来歴、等々を図中に掃き出す。
  3.iCADのDXFコンバータを起動し、一括してiCADモデル(.icd)に変換する。
  4.変換したiCADモデルを開き、icd_dxf2buhinzu.py を起動すると、2D図面に記入されている、品名、材質その他の諸元がパーツ付加情報に転記される。
  5.2D データーより、3D図形をモデリングする。

  従来はExcelを起動し、部品図を見ながらパーツ付加情報を手入力していたので転記の手間が無くなりました。
  また、「Excelの起動」に結構な時間がかかっていたのでイライラ感が減りました。


DXF変換したカム曲線をモデリングするための補助スクリプト(2020/7/25)::icd_cam.zip

  (添付 icd__cam2spline.txt 転記)

■  2Dcadで作成されたカム曲線をDXF変換してモデリング(「2D->D」「垂直投影」)しようとする場合いくつかの問題があります。
  1.2Dcad側で「スプライン」で作成された曲線が「その他の作図要素」として変換され、「垂直投影」時の「閉空間」要素
      として認識されない。
  2.2Dcad側で微小線分で作成された曲線(もどき)からそのまま「閉空間」を指定しようとすると、100~500個の線分を
      順番に指定しなくてはならなくなる。iCADの閉空間領域指定要素数の 128 を超えてしまう。
  3.「1」「2」共に端点がきちんと重なっていない場合が多く、微小なスキマや重なりが存在する。

  以上のような問題に対処して、ちゃんとした「閉空間」を指定できるような「スプライン」を作図してくれるのが
  本スクリプトです。

■  スクリプトの概要
  カムの構成要素として認識できるのは「円弧」「直線」「その他の作図要素(元スプライン}」「実像部品」です。
  これらの要素間の端点が重なっていない場合に「def merge_pnt_list(pl0,pl1)」関数に順次二つの点リストを渡して
  スキマや重なりを無くします。3mm以下のズレを「スキマ」「重なり」と認識して処理します。
  ですから、カム要素を指定する順番は重要です。「一個飛ばしたから後から指示」はなしです。

  iCADで指定できるスプラインの指定点数は800個以下です。これ以上の線分の集まりにならないようにする必要があります。
  また、余りに短い線分は加工データとして、不具合が発生する場合もあるようです。
  「def arange_pnt_list(pl0, lmt):」関数で、「lmt」以下の線分を除外しています。(169行目 lmt = 0.5)
  (起動時の引数渡しに変更しました。icd_cam.pyから起動するとエントリー窓から設定できます。)
  とりあえず 0.5 に設定してあります。よほどエッジの立ったカム(カムになり得ない?)でない限り大丈夫のはずです。
  どうしても心配な方は元図と重ねてみてズレを計ってみるといいでしょう。おそらく1/100以下です。

  「実像部品」や「円弧」間のスキマは埋めてくれますが、「実像部品」の中にすきまがある場合は対象外です。
  「実像部品」の構成には注意が必要です。
  カム一個が一つの実像部品はおそらくNGでしょう。

■ 使い方
  1.カム曲線を「閉空間」の認識の邪魔になりそうな要素のない空間に、コピーしてください。

  2.「垂直投影」コマンドを選択後、カム曲線をクリックしてみてください。一発でハッチングが現れて「閉空間」の認識
      に成功する場合もあり得ます。(普段の行いが試される?僕はまだ僥倖に巡り合ったことがありません)

  3.カム曲線が一個の「実像部品」になってる場合は「子図/部品/記号」「実像部品」「解除」で分解します。
      その後、カムの部分(細かい線分)を「実像部品」化してください。
      名称はなんでも構いませんが、「cam」でいいでしょう。
      「その他の作図要素」の場合はほっといて構いません。

  4. 本スクリプトを起動し、順次カム要素を選択します。

  5.選択し終わったら、「右クリック」してください。

  6.しばらくして、スプラインが作図されます。
      「垂直投影」コマンドでカム要素を一個クリックして、ハッチングが現れれば成功です。


これでicadデーターでカムの加工データーが作成できます。めでたしめでたし。
     

※注意
  最初、本スクリプトを走らせたとき、とぐろを巻いたようなスプラインができました。
  原因はカム要素部分の線分配列の並びがランダムだったため、スプラインの拾うポイントがあっちこっち
  いったためでした。そこで
  配列を x か y の長手方向でソートすることで解決しました。その部分のコードが以下です。

    # 長手方向でソート
    w_x = max(pnt_list, key = lambda x:x[0])[0] - min(pnt_list, key = lambda x:x[0])[0]  # x方向の幅
    w_y = max(pnt_list, key = lambda x:x[1])[1] - min(pnt_list, key = lambda x:x[1])[1]  # y方向の幅
    #print(w_x, w_y)

    if w_x >= w_y : # x方向に長い
        pnt_list1 = sorted(pnt_list, key=lambda x: x[0])       #x座標値sort
    else:           # y方向に長い
        pnt_list1 = sorted(pnt_list, key=lambda x: x[1])       #y座標値sort
このことは、 縦長(y方向に長い)のカム曲線の配列はy座標が大きい(小さい)順に並び 横長(x方向に長い)のカム曲線の配列はx座標が大きい(小さい)順に並ぶ ことを前提としています。 従って、この前提に当てはまらないような、途中で戻ってくるような曲線は全体を少し回転させることで うまくいくかもしれません。 他にいい方法(アルゴリズム)があれば教えてください。

カタログデータを一括インポートするスクリプト(2020/7/26)::icd_import.zip

  (以下、添付のicd_import.txt転記)

■  カタログデータの作成は結構負担感のある作業です。
    こないだなんかは三木プーリーのカップリングデータ(Step)を200個以上もダウンロードはしたものの、
    インポート作業をする気にはなれませんでした。
    同じパーツ付加情報、コメント、材質を延々と入力し続けなくてはねらないわけですから。
    これはやっとれん、ということで、一括インポートスクリプトを作成しました。

■  機能と使い方
  1. 「メーカー」「材質」「品名」が同じ製品をインポートする際に活躍します。

  2.「メーカー」を入力すれば、「Code検索」ボタンで「MakerCode」が自動で入力されます。※1

  3.色を指定すれば「色属性」も変更してくれます。

  4.「材質」も指定できます。重量計算用の比重設定のためなので、「鉄」「銅」「アルミ」「樹脂」
      程度の振り分けで充分かと思います。※2

  5.パーツ付加情報も設定してくれます。パーツ名には、ファイル名(拡張子無)が入ります。
      パーツ名を任意に変更したい場合は、ファイル名を変更してください。

  6.「保存後、閉じる」にチェックを付けると保存後にモデルを閉じます。
      チェックを付けなくても、10個以上のファイルを開く場合は11個目から閉じます。
      200個もファイルを開くとiCADが固まりそうなのでそうしました。
    (いくつまで同時に開けるかは知りません)

  7.保存先は読み込みフォルダーと同じです。
      同じ「ファイル名.icd」で保存されます。インポート後にカタログフォルダーに移動してください。

  8.パラソリッドの「軽量化」はまだ組み込めていません。少々お待ちください。


※1  メーカーコードcsv Fileは会社によって違うでしょうから、サンプルファイルを添付しました。書式の参考にしてください。
※2  材質設定もいろいろあるようです。63行目の設定ファイル名を編集してください。
      スクリプト64行目
        #fn_mtrl = 'C:\\ICADSX\\ETC\\icad_material.csv'      #材質設定File
      のコメントを外せば、iCAD標準の材質設定となるはずです。

揺動グリッパーのカム(円盤板カム)の作図スクリプト(2020/8/23)::icd_grp.zip


■  回転するホイル上の揺動グリッパーを駆動する円盤板カム曲線を作成するスクリプトです。
    カム曲線は「変形正弦」「変形台形」「変形等速度」「Cycroidal」の中から選択可能です。

■  必要なモジュール、関係ファイル(icd_grp.zipに同梱)
    icd_grp.py    my_vector.py    zen_han.py    universal_cam.py  icd_cam.py   icd_menu.py3   icd_grp.txt   icd_grp.icd
    (matplotlib 要 install)

■  基本的にはAcadの GRP.MAC のiCAD版です。
    ただし、作図したカムを3Dモデリングできるように、カム面の精度を上げています。
    また、円弧部分とカム面のスプラインがきちんと繋がるように工夫してあるので、モデリングの際に「閉空間」が
    一発で認識されます。(はずです)

■  以下の要領で、「matplotlib」をインストールしてください。インターネット環境が必要です。
    ない場合「Graph」機能は使えませんが、他の機能は使えます。
    コマンドプロンプトもしくはパワーシェルを起動して
      py -m pip install matplotlib

    もしくは

      pip install matplotlib

    と入力してください。

■  起動方法
    1.iCADを起動し、icd_grp.icd を開いてください
    2.Powershell もしくは コマンドプロンプトから
          py icd_grp.py
        と入力します。
    3.icd_menu.py3を起動して「カム関係」「グリッパー開閉カム」をクリックしてもOKです。


■  「割付角」「揺動角」「ホイル回転数」「カム曲線」「作図レイヤ」を入力してください
    「割付角」と「揺動角」には正負があります。反時計回転が正です。    

■  掴み代揺動角、掴み代割付角を決めるのに、例えば「揺動角τ」を指定して「τ->θ計算」ボタンを押すと
    揺動角がτとなる公転角度θが求まります。

■  同様に、θからτを求めることも可能です。

■  「Graph」ボタンを押すと「Matplotlib」が ストローク、速度、加速度を作図します。
    
■  「Cam作図」ボタンを押してください。
  1)グリッパホイルのPCDをピックします。
  2)グリッパーの揺動中心をピックします。
  3)ローラーの円をピックします。

  ※これらは事前に作図しておいてください。

    ローラー中心軌跡とカム面がスプラインで作図され、「最大圧力角」と「最大加速度」が表示されます。

■  「情報書出」ボタンを押して、画面の任意の点をピックすると、 諸条件が注記されます。

■  カムの他の部分が閉じていて、邪魔な線がなければクリック一発で閉空間を認識してくれます。(はずです)
    
  ※注 スプラインの補間点の距離が2mm程度になるように設定されています。
        カムの長さにもよりますが、「補間点」が40を超えると、スプラインが複数に分割されるので、「閉空間」作成時に
        短いスプラインを見逃さないようにしてください。

■  尚、universal_cam.py は牧野洋氏の論文「ユニバーサルカム曲線とその応用」を参考(というよりそのまま)に作成しました。
    僕にとっては初めてのクラスを使ったスクリプトです。スマートじゃないところ、不十分なところを指摘頂ければ望外の幸せです。

■  2020.11.28  カム面の作図位置によっては、カム面がローラーの反対面に作図されるバグを修正しました。

「ファイルを開く」補助メニュースクリプト(2020/11/28)::icd_read_menu.zip


■  よく開くicd Fileを登録できるメニューを作りました。

■  使い方
1.「登録番号」をクリックすると、現在アクティブなファイルが登録され、

      c:\ICADSX\icd_read_menu.dat

    に保存されます。このファイルをエディターで編集することも可能です。

2.登録されたボタンをクリックすると、そのモデルファイルが開きます。


以上です。  


円筒板カム作成スクリプト(2020/11/28)::icd_cyl_cam.zip


■ 円筒カムをモデリングするには
  割り付け角:θh
  微小角:dθ
  とすると
      nn = θh/dθ
  1)ホイル断面となる組立平面をnn+1個作成
  2)各組立平面にカムの断面を作図
  3)「ロフト」機能を使って、カムをモデリング

  という作業が必要となります。

■ これらの作業はかなり根気のいる作業で、モデリングの精度を上げようと思うと
    100個ぐらいの組立平面が必要となります。

■  そんな時に活躍してくれるのが本スクリプトです。

■ 各入力項目の説明は割愛しますが、「基礎高さ」というのは s=0の時の高さ、オフセット値、げた高さ
    のことです。

■ 注意点
  1)一度に作成できる組立平面の数は128個までです。
 2)カムは円筒形に見えますが、スプライン曲線で構成されているため、半径寸法が入りません。
      部品図とする場合には、円筒形から除外する要素として利用する(長瀬方式?)のがよいかもしれません。
  3)カムは3D空間の原点座標にモデリングされます。新規図面上でモデリングした上で、窓間コピーするのが
      お薦めです。

■  「ローラー径」は直動するカムフォロワの直径を入力します。
    カムフォロワの中心軌跡とカム面の曲線は同じではありません。(カム面は「カム曲線」に乗らない!)
    中心軌跡をローラー半径分オフセットした線がカム面となるので、その分組立平面を回転して補正してます。
    

■ 後日、部品図作成用に、カム展開図を2D空間に作図する機能も追加する予定です。