狠狠撸

狠狠撸Share a Scribd company logo
製造業向け3Dデータ変換ソリューション
におけるRuby活用事例




           株式会社エリジオン
            内山 滋 / suchi

                 2009/10/10
最初に要点を
製造業向け
 ソフトで
Ruby採用
製造業向け
ソフト開発でも
 Ruby活用
Good
以上
はじめに
はじめに

自己绍介

会社绍介      背景

事例绍介     ASFALIS

导入まで     CANVAS
          Script

社内利用事例

 谢辞
開催おめでとう
 ございます
Ruby
といえば

 島根
matz江
青春
プレイバック

   NHKアーカイブス 保存番組検索「青春ブレイバック」
   http://archives.nhk.or.jp/chronicle/search/
fj.sources
1995/12/21
>まつもと ゆきひろ@トヨタケーラムです.

>ここのところ,細々と開発を続けて来た
>オブジェクト指向スクリプト言語 rubyを
>公開します.

(fj.sources: 1995/12/21)

             Newsgroup: fj.sources
             From: m...@caelum.co.jp (Yukihiro Matsumoto)
             Date: 1995/12/21
             Subject: ruby 0.95 - object-oriented script language (0/7)
名古屋はRuby
 デビューの地
デビュー?
浜松
1990年に卒業して、ソフトハウスに入り
ました(中略)でも、浜松で働ける会社と出
合って、そこを選ぶんです。

(中略: 丌景気になり)

それでRubyの開発を始めたんです。会
社でやっていましたから、同僚には話して
いました。いろいろ応援してくれましたね。

         Tech総研「世界のオープンソースRuby開発者まつもとゆきひろ」
         http://rikunabi-next.yahoo.co.jp/tech/docs/ct_s03600.jsp?p=001005
浜松は
Ruby
誕生の地
浜Matzは
 Ruby
誕生の地
はじめに

自己绍介

会社绍介      背景

事例绍介     ASFALIS

导入まで     CANVAS
          Script

社内利用事例

 谢辞
自己绍介
suchi
      http://www.suchi.org/

       Ruby Lv: 初心者→中級
      好きなメソッド: String#%
      好きなrubyist: id: m_seki

好きなアジャイルプラクティス: ありのままの進捗を計測
     好きなXPプラクティス: 計画ゲーム

        好きなもの: 似てるもの
1990年に卒業して、ソフトハウスに入り
ました(中略)でも、浜松で働ける会社と出
合って、そこを選ぶんです。

(中略: 丌景気になり)

それでRubyの開発を始めたんです。会
社でやっていましたから、同僚には話して
いました。いろいろ応援してくれましたね。

         Tech総研「世界のオープンソースRuby開発者まつもとゆきひろ」
         http://rikunabi-next.yahoo.co.jp/tech/docs/ct_s03600.jsp?p=001005
同僚のYさん
=最初の上司
4107册



        http://hondana.org/suchi
似てるもの
业务では

   品質管理
シニアマネージャ
 (開発もします)
http://d.hatena.ne.jp/higayasuo/
Coraleef
VB/Delphi App
→ Adobe AIR 移行Tool

?開発リーダー
?フルセットXP開発
?社内初のアジャイル事例
 →以降社内では当たり前の選択肢に

                http://www.isid.co.jp/solution/development/coraleef.html
           http://itpro.nikkeibp.co.jp/article/COLUMN/20071128/288169/
はじめに

自己绍介

会社绍介      背景

事例绍介     ASFALIS

导入まで     CANVAS
          Script

社内利用事例

 谢辞
会社绍介
株式会社エリジオン
? 本社: 静岡県浜松市
? 設立: 1999/11/1
? 社員数: 71名




                  http://www.elysium.co.jp/
技術ベース
? 3次元形状処理
? データ変換
? データ検証?修正




             http://www.elysium.co.jp/
Web採用ページ
? 一辺の長さが2nの立方体があり(nは整数)、その中心に
  直径2n-1の球を配置します。
? 立方体を一辺1の格子に区切ったとき、球の表面が通過
  する格子の数をXとします。
? X>2008となる最小のnはいくつでしょうか?




          http://www.elysium.co.jp/recruit/pretestx/000014.html
Renault F1 Team 公式サプライヤ
                                                                                             データ変換

                                                         2週間?3.5時間




          http://www.renaultf1.com/en/_2009/team/partenaires/partenaires_rf1/partenaires_is_it_partners/partenaires_is_it_partners_elysium/
事例绍介
はじめに

自己绍介

会社绍介      背景

事例绍介     ASFALIS

导入まで     CANVAS
          Script

社内利用事例

 谢辞
背景
3Dデータ処理
? 1) 3D CADデータ変換
?   2)   データチェック
?   3)   データ修正
?   4)   データ最適化
?   5)   Viewer
?   6)   and so on...
1)颁础顿データの変换

   CAD(A)     CAD(B)




              NG!
1)颁础顿データの変换


   CAD(A)   NG!


                  CAD(B)


            OK
2) データチェック
3) データ修正
? Healing
4) データ最適化
? 例:簡略化
5) Viewer
6) その他いろいろ



    Auto-Surfacing




                     Polygon Processing
中間表現
? 多数のCAD            ? データ変換
 – 現在も15種類以上         – NxNの組み合わせ
   ? CATIA V4
                    ? データ処理
   ? CATIA V5
                     – 一般化
   ? I-DEAS
   ? Pro/E
   ?   UG
   ?   SolidWorks
   ?   Inventor
   ?   CoCreate
   ?     :
まもなく
 Ruby
出てきます
はじめに

自己绍介

会社绍介      背景

事例绍介     ASFALIS

导入まで     CANVAS
          Script

社内利用事例

 谢辞
ASFALISモジュール化
? 3Dデータ処理のためのモジュールパッケ
  ージ
 – CAD X用
   ? ENF Writer
   ? ENF Reader

 – Optimizer
 – Checker
 – Viewer

 – 内部的に
   ? 共通処理カーネル
ASFALIS – ENF中心のソリューション
ASFALISの利用方法
? 受託案件におけるコンポーネント
? 顧客のシステムへの組み込み
? 代理店様の别システムへの组み込み
ASFALISをさらに使いやすく
? 部課単位で使いたい
? 小規模な業務フローを簡単に記述したい
? セールスチームが顧客用なシンプルなカ
  スタマイズしたい
シナリオファイル
                  <?xml version="1.0"?>
? 手順をXMLで記述       <ScenarioList>
                    <Scenario>
 – シンプルな手順に有効         <CAD2ENF>
                        <inputfile path="${INPUTFILE}
? →さらに使いやすく             <outputfile path="${OUTPUTFIL
                        <parameterfile path="${PARAME
 – 外部モジュールを呼びたい         <productcode id="105001" />
                        <workdir path="${WORKDIR}" />
 – 条件分岐/判定したい           <logfile path="${LOGFILE}" />
                        <xmllogfile path="${XMLLOGFIL
  ? モジュール返値
                      </CAD2ENF>
  ? データチェックの結果        <ASMEDIT>
  ? ファイルの存在             <inputfile path="${OUTPUTFILE
                        <outputfile path="${OUTPUTFIL
                        <parameterfile path="${PARAME
                        <workdir path="${WORKDIR}" />
                        <logfile path="${LOGFILE}" />
                        <xmllogfile path="${XMLLOGFIL
                      </ASMEDIT>
                      <ATTREDIT>
はじめに

自己绍介

会社绍介      背景

事例绍介     ASFALIS

导入まで     CANVAS
          Script

社内利用事例

 谢辞
ELYSIUM
CANVAS
 Script
お待たせしました
  Ruby
   です
CANVAS Script
? CAx iNtegrator Via Asfalis Solution


? Rubyから各モジュールを呼び出せる
? モジュールのInput/Outputの接続をわかり
  やすく
? CADが必要なモジュールのリモート呼び出し
? ユーザコンポーネントを定義可能
  – 顧客独自のコンポーネントの定義が可能
スクリプト例
         require 'canvas'
         CANVAS::Session.open {|session|
           # Shared work folder
           session.shared_workdir = ARGV[2]

             # Definition of   component
             parasolid2enf =   session.create_component(:parasolid2enf)
             asmedit       =   session.create_component(:asmedit)
             attredit      =   session.create_component(:attredit)

             # Connection between the components
             parasolid2enf[:inputfile] = ARGV[0]
             parasolid2enf[:CalcMassProperty] = 1
             parasolid2enf[:CalcElementNumber] = 1

             asmedit[:inputfile] = parasolid2enf[:outputfile]
             asmedit[:CopySharedPart] = 1
             asmedit[:CopySharedAssembly] = 1

             attredit[:inputfile] = asmedit[:outputfile]
             attredit[:mapfile] = 'w:?conf?NrkMappingFIle.xml'

             # Execution
             session.start

             # Output
             attredit.copy_result_to(ARGV[1])
         }
準備
require 'canvas'
セッション
CANVAS::Session.open {|session|
  :
  :

}
コンポーネント生成
parasolid2enf = session.create_component(:parasolid2enf)
asmedit       = session.create_component(:asmedit)
attredit      = session.create_component(:attredit)
コンポーネントの設定
コンポーネントの接続
parasolid2enf[:inputfile] = ARGV[0]
parasolid2enf[:CalcMassProperty] = 1
parasolid2enf[:CalcElementNumber] = 1

asmedit[:inputfile] = parasolid2enf[:outputfile]
asmedit[:CopySharedPart] = 1
asmedit[:CopySharedAssembly] = 1

attredit[:inputfile] = asmedit[:outputfile]
attredit[:mapfile] = 'w:?conf?NrkMappingFIle.xml'
セッション実行
session.start
スクリプト例
         require 'canvas'
         CANVAS::Session.open {|session|
           # Shared work folder
           session.shared_workdir = ARGV[2]

             # Definition of   component
             parasolid2enf =   session.create_component(:parasolid2enf)
             asmedit       =   session.create_component(:asmedit)
             attredit      =   session.create_component(:attredit)

             # Connection between the components
             parasolid2enf[:inputfile] = ARGV[0]
             parasolid2enf[:CalcMassProperty] = 1
             parasolid2enf[:CalcElementNumber] = 1

             asmedit[:inputfile] = parasolid2enf[:outputfile]
             asmedit[:CopySharedPart] = 1
             asmedit[:CopySharedAssembly] = 1

             attredit[:inputfile] = asmedit[:outputfile]
             attredit[:mapfile] = 'w:?conf?NrkMappingFIle.xml'

             # Execution
             session.start

             # Output
             attredit.copy_result_to(ARGV[1])
         }
詳しいサンプルはWebで



http://www.elysium.co.jp/products/asfalis/index.html
Desktop Controler
? ADC(ASFALIS Desktop Controller)
  – データ処理をスケジューリング
  – CANVAS Scriptを生成/実行
  – 簡単に定期処理、夜間バッチ変換システムを構築可能
  – MFCアプリケーション
モジュール図
 Ruby      Win
 Script    App

                                                       Server


                                 Canvas                Canvas
                 CANVAS
                                 Library               Library
                  Script
                                  dRuby                    dRuby


   ADC
(MFC Win App)


                                                ASFALIS
                                               Component                         Loader
                 Scheduler                                                     (Console App)
                 (Console App)


                                                 derived

                                            proe2enf        asmedit    pro2enf.exe     asmedit.exe
                                           Component       Component   (Console App)    (Console App)
Good
? 動的言語やモダンな言語のメリット享受
    – C/C++と比べて
? 驚くほど簡単に記述できる。
? 自然に書けて行数尐ない/手間尐ない。
?   メソッド上書きやeval
?   dRuby
?   豊富なライブラリ
?   行き詰まったときにWebに情報が多い
Bad
? (社内)アーリーアダプタ特有のトラブル
 – 当然あったが
 – リスクを見込んだスケジューリングでカバー
? dRuby
 – 透過的に書けすぎて、サーバ/クライアントの結合が
   密になってしまった
Bad
? 海外代理店からは「Ruby?」
 – 別言語のI/Fを追加するかも
 – 日本の代理店に置き換えて考えてみよう
      ? Allegro Common Lisp? / Lua?
      ? 理解できる

? スピード
 – 1.9対応したい
要望
? gemでインストールするとき、メモリ消
  費が激しい
? gemの配布条件を調べるのに手間がかか
  った
 – たとえばこんなオプションがあれば
 – gem -license actionmailer
导入まで
はじめに

自己绍介

会社绍介      背景

事例绍介     ASFALIS

导入まで     CANVAS
          Script

社内利用事例

 谢辞
現状: 社内Rubyユーザ
? 開発者約30人
 – カタコトも含めれば2/3はRubyを使える
 – Ruby技術レベルは決して突出していない
? 業務でのRuby利用
 – イキのいい若い社員が主導
各個人での利用はずっと前から
? さまざまな開発手続きの自動化やワンラ
  イナー
 – バッチファイル, Born-Shell, Perl, Ruby,
   Windows Script(VBScript/JScript),
   Windows PowerShell, Python
? あまり制限されない。任されている
? が、ここ5年でRubyがデファクト化
勉強会
? 勉強会が推奨されている
 –   裁量性なので、時間も自由
 –   デザインパターン / Effective C++
 –   Code Complete /アジャイル開発
 –   ISO 10303-59 / 計算位相幾何
2005-2006
CODE COMPLETE 2nd 勉強会
14名(入社1-2年目社員中心)
34章を1年でCOMPLETE
Ruby勉強会
? 2007
? 参加者: 14名
? スキルにあった内容を皆バラバラに学ぶ
Ruby導入
? 役員、上司、お客様からの制限はなし
 – 問題解決指向
? CTO – 技術全般への目の配り
 – 例: ファウラー「リファクタリング」
? 開発者に基本的に任されている
? 社風
 – 取り組みを評価する社風
 – 例: アジャイル導入
  ? トップが柔軟で理解がある
  ? 目的指向
とはいえ
? 安易な考えは却下
? 顧客対応部署に説明できるか
? 浮かれRubyistではないか
 – 手段が目的より優先してないか
 – おまえRubyって言いたいだけちゃうんか
? リスクを認識しているか
? 覚悟はあるか
 – 一度否定されて引っ込めるようではダメ
 – いざというときRuby/Libraryのせいにしない
 – いざというときソースを読む覚悟
s/Ruby/ソーシャルなんとか/g
s/Ruby/クラウド/g
s/Ruby/twitter/g
s/Ruby/.NET/g
s/Ruby/Rails/g
Why Ruby?
? Good参照
バランス感覚重要
? エンジニアの重要な資質?
 – パラノ資質と共存可能
? 他言語/システムを知っているか
 – Rubyだけ勉強していてもダメ
 – 一部業界だけを参考にしてもダメ
  ? 永遠のβ←日本の製造業の超高品質プロセスを維持できるか?

? メリット/デメリットを正確に挙げられるか
 – それ○○でできるよ
社内利用例
はじめに

自己绍介

会社绍介      背景

事例绍介     ASFALIS

导入まで     CANVAS
          Script

社内利用事例

 谢辞
社内利用例
? 個人的なスクリプト
?   プロジェクト内のスクリプト
?   社内カーネル利用インターフェイス
?   テストで使うスクリプト
?   テストシステム(サーバはRails)

? Redmine
    – でも主要は独自タスクDB(運用10年)
    – アジャイル開発はXPlanner
一時的なスクリプト
? Widowsの.rcファイル自動生成
 group = {
   "標準" => ["IDC_BUTTON_PICK", "IDC_BUTTON_ZOOM", ...]
   "並び替え" => ["IDC_BUTTON_UP", "IDC_BUTTON_DOWN", nil, ...]
   "編集" => ["IDC_BUTTON_EDIT_HOLE_PATTERN", ...]
 }

 x = 9
 group.each do |name, list|
   buttons = []
   x1 = x
   x += 4
   list.each do |obj|
     if obj.nil?
       x += 3
     else
       buttons.push "    PUSHBUTTON      ?"?",#{obj},#{x},18,16,16,BS_ICON"
       x += 16
     end
   end
   puts "    GROUPBOX        ?"#{name}?",IDC_STATIC,#{x1},7,#{x-x1+4},32"
   puts buttons.join("?n")
   x += 10
 end
テスト用ツール
? 高い品質維持
 – テストの増加
? テストの自動化
 – テストの自動生成
中間ファイル操作ライブラリ
? C/C++で作成されたライブラリ
 – Rubyから呼びだすためのライブラリ
? 機能テストの判定に利用
? 開発中に利用
ENF Handler

 ENF Info     ENF
                              Rubyによる
  Reader     Editor   ...
                              各種ツール
  (Ruby)    (Ruby)

    ENF Handler (Ruby)        Ruby I/Fは
                              下層に依存しない

        Ruby C拡張              Handlerに必要な
                              ところだけ
       C I/F

   ELYSIUM Foundation Class Library(C++)
テストシステム
? Railsを利用したテストサーバ
?   Rubyによる実行システム
?   判定条件を名前付けRubyクラスで記述
?   テスト項目は判定条件とパラメータ
?   →自動テスト可能に
今后
今后のRuby利用
? CANVAS Script
 – 続々と展開中、典型的利用方法もライブラリ化
? テストシステム開発
? 新規開発プロジェクトでもRuby採用
 – 複数言語のシステム
   ? C/C++ ~ 長く継続していたWindows App
   ? C#(.NET) ~ 新規作成Windows GUI App / クライアント
   ? Ruby ~ サーバ(Railsも利用)
   ? サーバ/Client間はSOAP

 – Rubyにこだわっていない
   ? ←→Rubyに価値がある証拠!
はじめに

自己绍介

会社绍介      背景

事例绍介     ASFALIS

导入まで     CANVAS
          Script

社内利用事例

 谢辞
谢辞
名古屋Ruby会議
  Rubyの会
他Rubyに関わる皆様
Regional Ruby会議発案者

角谷信太郎
 さん
http://b.hatena.ne.jp/entry/twitter.com/suchi/statuses/
@Wikiばな Vol.7




      http://wikibana.socoda.net/wiki.cgi?WikiBana%2fVOL.7
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
ところで
角谷さんの翻訳された
最后にも要点を
製造業向け
 ソフトで
Ruby採用
製造業向け
ソフト開発でも
Ruby活用
Good
名古屋はRuby
 デビューの地
開催おめでとう
 ございます
以上
ご清聴
ありがとうございました
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
付録
現実的なスクリプト例
? 1. 解析に丌要な微小部品を削除
 – ASFALISアダプタ(体積取得)
 – アセンブリ編集コンポーネント(削除)

? 2. 解析失敗の原因となる部品間干渉を検証
 – 干渉チェックコンポーネント
 – アセンブリ編集コンポーネント(削除)

? 3. 解析に丌適な形状削除
 – 形状簡略化コンポーネント(フィレット?段差削除)
 – 干渉チェックコンポーネント(簡略化後の干渉チェック)

? 4. CAEツール向けにデータ修正しParasolidへ変換
 – ASFALISアダプタ(ヒーリング/Parasolid形式へ変換)
フロー
      A   B




 A    B
スクリプト例(1)
 require 'canvas'
 require 'parser.rb'

 CANVAS::Session.open do |session|
   config = session.parse_config(ARGV[0])

  session.shared_workdir = config[:shared_workdir]

  # コンポーネントを作成
  catiav52enf = session.create_component('catiav52enf')

  asmedit = session.create_component('asmedit')
  intrcheck = session.create_component('intrcheck')
  asmedit2 = session.create_component('asmedit')
  simplify = session.create_component('simplify')
  dek = session.create_component('dek')
  enf2parasolid = session.create_component('enf2parasolid')
スクリプト例(2)
 # コンポーネントの出入力データのマッピング定義、オプションを指定
 catiav52enf[:inputfile] = config[:inputfile]
 catiav52enf[:CalcMassProperty] = '1'

 asmedit[:inputfile] = catiav52enf[:outputfile]
 asmedit[:DeleteSpecifiedPart] = '1'
 asmedit[:namelist] = 'namelist1.txt'

 intrcheck[:inputfile] = asmedit[:outputfile]
 intrcheck[:ExcludeNoShowElement] = '1'
 intrcheck[:ReportIntrVolume] = '1'


 asmedit2[:inputfile] = intrcheck[:outputfile]
 asmedit2[:DeleteSpecifiedPart] = '1'
 asmedit2[:namelist] = 'namelist2.txt'
スクリプト例(3)
  simplify[:inputfile] = asmedit2[:outputfile]
  simplify[:Process].add :RemoveFillet, {
    :AvoidInterferenceAmongParts => '1',
    :AvoidInterferenceWithinPart => '1',
    :FilletMaxRadius => '5',
    :FilletMinRadius => '1',
    :ProhibitInvalidGeometryCreation => '1'
  }
  simplify[:Process].add :RemoveStep, {
    :ProhibitInvalidGeometryCreation => '1',
    :StepMaxHeight => '0.1'
  }

  dek[:inputfile] = simplify[:outputfile]
  dek[:to_cad] = 'parasolid'

  enf2parasolid[:inputfile] = dek[:outputfile]
スクリプト例(4)
  # 処理を実行

  catiav52enf.execute
  asmedit.execute
  xml_parse(asmedit[:xmllogfile],namelist1.txt)
  intrcheck.execute
  xml_parse(intrcheck[:csvfile],namelist2.txt)
  asmedit2.execute
  simplify.execute
  dek.execute
  enf2parasolid.execute

  # 出力ファイルを保存
  enf2parasolid.copy_result_to(config[:outputdir])

 end

More Related Content

名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例