ラベル Journal の投稿を表示しています。 すべての投稿を表示
ラベル Journal の投稿を表示しています。 すべての投稿を表示

2010年4月26日月曜日

操作手順や補足


何とか動いたので、まとめておきます。

必要なもの

必要な設定

  • NX5が動くPC
  • C:\nxgate\tempフォルダ

操作動画

実際に実行するとこんな感じになりました。
前半30秒だけが操作動画で、以降はひたすら自動生成するだけの動画です。


ファイル選択とか画像が切れているので、↓手順を載せておきます。

 

操作手順

  1. ダウンロードしたUCF_ORG.prtを開く
  2. メニューのツール→ジャーナル→再生
    journal9
  3. ブラウズを選択
    journal10
  4. 拡張子をvbに変更したnxGateCreatePart_csv.vbを選択
    journal11
  5. 実行
    journal12
  6. ファイル選択ダイアログでUCF.csvを選択
    journal13 
  7. CSVに登録されている数だけパートファイルを作り続けます。

補足

以下のように、パートファイル内の式の名前(変数名)と同じ名称がCSVファイルの1行目(タイトル行)にあれば、他の形状でもOKです。

UCF.prtの式
exp1

UCF.csvのタイトル行
exp2 

参考までにいくつかのパートファイルとCSVファイルを作ってみました。

UCFC
http://sites.google.com/site/nxgatentn/UCFC_ORG.prt
http://sites.google.com/site/nxgatentn/UCFC.csv

UCFL
http://sites.google.com/site/nxgatentn/UCFL_ORG.prt
http://sites.google.com/site/nxgatentn/UCFL.csv

UCP
http://sites.google.com/site/nxgatentn/UCP_ORG.prt
http://sites.google.com/site/nxgatentn/UCP.csv

KR
http://sites.google.com/site/nxgatentn/KR_ORG.prt
http://sites.google.com/site/nxgatentn/KR.csv

完成したジャーナル

Importsの内容とかMainの位置とかいろいろ変えてみて、以下のコードで動きました。パート属性を割り当てるところはNXのOpen for .NETヘルプを見ました。

Option Strict Off
Imports System
Imports NXOpen
Imports system.IO
Imports VB = Microsoft.VisualBasic
Imports System.Windows.Forms
Imports system.text

Module NXJournal
Sub Main
    Dim theSession As Session = Session.GetSession()
    Dim workPart As Part = theSession.Parts.Work
    Dim displayPart As Part = theSession.Parts.Display

    '---------------------------------------
    'ここからVB
        ' --------------------------------------
        Dim pathNXGate As String = "C:\nxgate\temp\"
        Dim tmpFile As String
        Dim tmpFileExp As String
        Dim sTmp(5) As String
        Dim sAry() As String
        Dim sTitle() As String
        Dim sAttId As String
        Dim sAttNam(30) As String
        Dim sAttVal(30) As String
        Dim iAttChk(100) As Integer
        Dim iCtAtt As Integer = 0
        Dim iCt As Integer = 0
        Dim i As Integer
        Dim num As Integer
        Dim sExpLn As String = ""
        Dim sLTtl As String = ""
        Dim aLn() As String
        Dim sjisEnc As Encoding = Encoding.GetEncoding("Shift_JIS")
        ' --------------------------------------File開くDialog
        Dim ofd As New OpenFileDialog()
        ofd.FileName = "csvUCF.csv"
        ofd.InitialDirectory = pathNXGate
        ofd.Title = "寸法リストファイルを選択"
        If ofd.ShowDialog() = Windows.Forms.DialogResult.OK Then
            tmpFile = ofd.FileName
        Else
            Exit Sub
        End If
        ' --------------------------------------DataFile有
        ' 1行目はタイトル行
        ' パート属性にする列タイトルは先頭にatt_をつける
        ' FILE名するタイトルは、att_CL_ID固定&このタイトルは必須
        If File.Exists(tmpFile) Then
            FileOpen(1, tmpFile, OpenMode.Input, OpenAccess.Read)       ' 読込
            ' ----------------------------------------------1行目(Title行)処理
            sTmp(0) = LineInput(1)                          ' d,att_CL_ID,L...
            sTmp(0) = Replace(sTmp(0), Chr(9), "")          ' Tab除去
            sTitle = Split(sTmp(0), ",")
            num = sTitle.Length                             ' title総数
            For i = 0 To num - 1
                If sTitle(i).IndexOf("att_") = 0 Then       ' 先頭がatt_
                    sTitle(i) = Replace(sTitle(i), "att_", "")
                    iAttChk(i) = iCtAtt
                    iCtAtt = iCtAtt + 1                     ' 属性数
                Else                                        ' att以外
                    iAttChk(i) = -1                         ' 属性Check
                End If
            Next
            ' ----------------------------------------------2行目以降(Title行以外)処理
            Do While Not EOF(1)
                sTmp(0) = LineInput(1)
                sTmp(0) = Replace(sTmp(0), Chr(9), "")      ' Tab除去
                sAry = Split(sTmp(0), ",")
        sAttId=""
        sExpLn=""
                For i = 0 To num - 1
                    If sTitle(i) <> "" Then
                        If iAttChk(i) > -1 Then             ' 属性の場合
                            sAttNam(iAttChk(i)) = sTitle(i) ' 属性名
                            sAttVal(iAttChk(i)) = sAry(i)   ' 属性値
                            If sTitle(i) = "CL_ID" Then     ' IDの場合
                                sAttId = sAry(i)            ' ID
                            End If
                        Else
                            sExpLn = sExpLn & sTitle(i) & "=" & sAry(i) & vbCrLf
                        End If
                    End If
                Next
                ' ------------------------------------------式インポート用ファイル作成
                tmpFileExp = pathNXGate & sAttId & ".exp" 
                Dim writer As New StreamWriter(tmpFileExp, False, sjisEnc)
                writer.WriteLine(sExpLn)
                writer.Close()
        ' ここからJournal
        ' ----------------------------------------------
        ' メニュー: ツール->Expression...
        ' ----------------------------------------------
        Dim markId1 As Session.UndoMarkId
        markId1 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "Expression")

        Dim expModified1 As Boolean
        Dim errorMessages1() As String
        workPart.Expressions.ImportFromFile(tmpFileExp, ExpressionCollection.ImportMode.Replace, expModified1, errorMessages1)
        Dim markId2 As Session.UndoMarkId
        markId2 = theSession.SetUndoMark(Session.MarkVisibility.Invisible, "Update Expression Data")
        Dim nErrs1 As Integer
        nErrs1 = theSession.UpdateManager.DoUpdate(markId2)

        theSession.DeleteUndoMark(markId2, "Update Expression Data")

        Dim markId3 As Session.UndoMarkId
        markId3 = theSession.SetUndoMark(Session.MarkVisibility.Invisible, "Update Expression Data")

        Dim nErrs2 As Integer
        nErrs2 = theSession.UpdateManager.DoUpdate(markId3)

        theSession.DeleteUndoMark(markId3, "Update Expression Data")
        ' ----------------------------------------------
        ' 属性割当
        ' ----------------------------------------------
                For i = 0 To iCtAtt - 1 
            workPart.SetAttribute(sAttNam(i), sAttVal(i))
        NEXT
        ' ----------------------------------------------
        ' メニュー: ファイル->名前を変えて保存...
        ' ----------------------------------------------
        Dim partSaveStatus1 As PartSaveStatus
        partSaveStatus1 = workPart.SaveAs(pathNXGate & sAttId)
        partSaveStatus1.Dispose()
            Loop
        End If
' ----------------------------------------------
' メニュー: ツール->ジャーナル->停止
' ----------------------------------------------

End Sub
End Module

完成したコードはこれです。拡張子がvbだとアップロードできなかったので、ダウンロード後、拡張子をtxt→vbに変更してください。
http://sites.google.com/site/nxgatentn/nxGateCreatePart_csv.txt?attredirects=0&d=1

操作手順などへ続きます

繰り返し処理のプログラムを作る

Visual Basic 2005 Express Edition

寸法表からインポートする式ファイルを作るところはNXに関係ないプログラムですので、通常のVBのコードで問題ないと思います。VBには、 Express Editionという無償版があるので、そちらを利用してVBの処理を作成していこうと思います。NX5のヘルプを見るとMicrosoft .NET Framework 2.0 に対応と書いてあります。この文章を書いている今は2010年4月。そう、Visual Basic 2008 になってます。.NET Frameworkは3.5?かな...どうしよう...ググってみると、まだ、VB2005のダウンロードができるそうなので、VB2005を使うことができました。
(参考にさせて頂いたサイト→ http://winmac.blog33.fc2.com/blog-entry-98.html

寸法表ファイル

寸法表はこんなCSVファイルとしました。各値は,(カンマ)区切りです。

d ,att_CL_ID ,L ,J ,A1 ,A ,N ,A0 ,att_CL_M ,att_CL_NAMEJ
12 ,UCF201 ,86 ,64 ,11 ,25.5 ,12 ,33.3 ,M10 ,角フランジ形ユニット
15 ,UCF202 ,86 ,64 ,11 ,25.5 ,12 ,33.3 ,M10 ,角フランジ形ユニット
17 ,UCF203 ,86 ,64 ,11 ,25.5 ,12 ,33.3 ,M10 ,角フランジ形ユニット
att_で始まる項目 : パート属性(ファイルのプロパティのようなもの)としてパートファイルに割当
att_CL_ID : ファイル名に使用する必須列とタイトル

実際のCSVファイルはこれです。
https://sites.google.com/site/nxgatentn/UCF.csv?attredirects=0&d=1

式インポート用のファイル

式インポートファイルの書式は、式名=値です。こんな感じです。
d=12
L=86
J=64
...
CSVファイルを読み込んで、1行ずつこの書式の式ファイルを作成すればOKです。

VB

以降、ググってコピペして、ググってコピペして、ググってコピペして...完成したコードです。いろんな書き方が混ざっているので、VB使いの人には怒られるようなコードなのかもしれませんが、とりあえず良しとしておきます。

おまけにVB2005のプロジェクト作成時に、ウィンドウズアプリケーションで始めればいいのかな?と思って作っていたのですが、途中でFormがいらないことに気づきました(...orz)。直し方がわからなかったのでそのままにしてあります。使うのはPrivate Subの中身なので関係なかったのですが、次はForm使わないようにします / とり方を覚えます。

Option Strict Off
Option Explicit On
Imports system.IO
Imports VB = Microsoft.VisualBasic
Imports System.Windows.Forms
Imports system.text

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim pathNXGate As String = "c:\nxgate\temp\"
        Dim tmpFile As String
        Dim tmpFileExp As String
        Dim sTmp(5) As String
        Dim sAry() As String
        Dim sTitle() As String
        Dim sAttId As String
        Dim sAttNam(30) As String
        Dim sAttVal(30) As String
        Dim iAttChk(100) As Integer
        Dim iCtAtt As Integer = 0
        Dim iCt As Integer = 0
        Dim i As Integer
        Dim num As Integer
        Dim sExpLn As String = ""
        Dim sLTtl As String = ""
        Dim sjisEnc As Encoding = Encoding.GetEncoding("Shift_JIS")
        ' --------------------------------------File開くDialog
        Dim ofd As New OpenFileDialog()
        ofd.FileName = "csvUCF.csv"
        ofd.InitialDirectory = pathNXGate
        ofd.Title = "寸法リストファイルを選択"
        If ofd.ShowDialog() = Windows.Forms.DialogResult.OK Then
            tmpFile = ofd.FileName
        Else
            Exit Sub
        End If
        ' --------------------------------------DataFile有
        ' 1行目はタイトル行
        ' パート属性にする列タイトルは先頭にatt_をつける
        ' FILE名にするタイトルは、att_CL_ID固定&このタイトルは必須
        If File.Exists(tmpFile) Then
            FileOpen(1, tmpFile, OpenMode.Input, OpenAccess.Read)
            ' ----------------------------------------------1行目(Title行)処理
            sTmp(0) = LineInput(1)
            sTmp(0) = Replace(sTmp(0), Chr(9), "")
            sTitle = Split(sTmp(0), ",")
            num = sTitle.Length 
            For i = 0 To num - 1
                If sTitle(i).IndexOf("att_") = 0 Then           ' 先頭がatt_
                    sTitle(i) = Replace(sTitle(i), "att_", "")    ' att_削除
                    iAttChk(i) = iCtAtt                              ' 属性数カウント
                    iCtAtt = iCtAtt + 1
                Else
                    iAttChk(i) = -1
                End If
            Next
            ' ----------------------------------------------2行目以降(Title行以外)処理
            Do While Not EOF(1)
                sTmp(0) = LineInput(1)
                sTmp(0) = Replace(sTmp(0), Chr(9), "")      ' Tab除去
                sAry = Split(sTmp(0), ",")
                sAttId = ""
                sExpLn = ""
                For i = 0 To num - 1
                    If sTitle(i) <> "" Then
                        If iAttChk(i) > -1 Then
                            sAttVal(iAttChk(i)) = sAry(i)
                            If sTitle(i) = "CL_ID" Then     ' ファイル名タイトル
                                sAttId = sAry(i)
                            End If
                        Else 
                            sExpLn = sExpLn & sTitle(i) & "=" & sAry(i) & vbCrLf 
                        End If
                    End If
                Next 
                ' ------------------------------------------式インポート用ファイル作成
                tmpFileExp = pathNXGate & sAttId & ".exp"
                Dim writer As New StreamWriter(tmpFileExp, False, sjisEnc)
                writer.WriteLine(sExpLn)
                writer.Close()
               'ここにジャーナルコードを追加する
            Loop
        End If
        Me.Close()
    End Sub
End Class

このコードのファイル作成(write.Closeのところ)の後に、形状変更と名前を変えて保存のそれぞれのジャーナルを追加しておけば、動くはずです!

とりあえず、ほぼ完成!(多分)

あとはジャーナルと合わせてほんとの完成です。


次へ続きます

ジャーナルファイルを見てみる

生成されたジャーナルファイルをメモ帳で開くとこんな感じになっています。
c:\nxgate\journal1.vb
Option Strict Off
Imports System
Imports NXOpen

Module NXJournal
Sub Main

Dim theSession As Session = Session.GetSession()
Dim workPart As Part = theSession.Parts.Work

Dim displayPart As Part = theSession.Parts.Display

' ----------------------------------------------
' メニュー: ツール->Expression...
' ----------------------------------------------
Dim markId1 As Session.UndoMarkId
markId1 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "Expression")

Dim expModified1 As Boolean
Dim errorMessages1() As String
workPart.Expressions.ImportFromFile("C:\nxgate\sample1.exp", ExpressionCollection.ImportMode.Replace, expModified1, errorMessages1)

Dim markId2 As Session.UndoMarkId
markId2 = theSession.SetUndoMark(Session.MarkVisibility.Invisible, "Update Expression Data")

Dim nErrs1 As Integer
nErrs1 = theSession.UpdateManager.DoUpdate(markId2)

theSession.DeleteUndoMark(markId2, "Update Expression Data")

' ----------------------------------------------
' メニュー: ツール->ジャーナル->停止
' ----------------------------------------------

End Sub
End Module


太字のところがインポートする式のファイル名です。
VBを使って
寸法表読込(VB)→式ファイル作成(VB)→式ファイルをインポート(このjournal)
というループを作ればできそうです。

もうひとつの名前を変えて保存も同じ手順でジャーナルとして記録しておきます。

次へ続きます

ジャーナルの記録

思ったより手間がかかってますが、ここからがジャーナルです。

  1. メニューのツール→ジャーナル→記録
    journal3

  2. 以下の
    NX アプリケーション関数の完全なジャーナル範囲は現在使用できません。なんたらかんたら
    という警告がでますが、気にせずOKをクリック。
    journal4

     
  3. 適当なファイル名を入力→OK(以下、c:\nxgate\journal1.vbとします。)
    journal5
    ここからの操作は全て記録されため、緊張しながら操作します。
     
  4. メニューのツール→式→式をファイルからインポート
    journal6

  5. 先ほど作成したファイル(c:\nxgate\sample1.exp)を選択→OK
    journal7

  6. OKをクリックして式ダイアログを終了

  7. メニューのツール→ジャーナル→停止
    journal8

これで外部ファイル取込→パラメータ(式)を変更→形状変更、というジャーナルが完成しました。


次へ続きます

準備:雛形モデルと式インポートに利用するパラメータファイルの作成

  1. パラメトリックな雛形モデルを作成(以下、NTN さんのUCF を例にしていきます。)
    journal0 
    使用したモデルはこれです。
    https://sites.google.com/site/nxgatentn/UCF_ORG.prt
  2. メニューのツール→式
    journal1
  3. 式をファイルにエクスポート→適当な場所、ファイル名で保存
    (以下、c:\nxgate\sample1.expとします。)
    journal2 

このsample1.expをインポートするジャーナルを作成します。


次へ続きます

作成するジャーナルの大雑把な流れを考えてみる

CADLIBにあるParasolidデータのNX版を自動生成するジャーナルを作ってみたいと思います。
とりあえず、寸法表と雛形モデルの作成は手作業でやるとして、

  1. モデルの形状変更
  2. 名前を変えてファイルを保存
  3. モデル数分繰り返し

これだけの処理を行うプログラムを作ることにします。
(これだけか…簡単そうです (^^)
作るものを列挙しておくと、

  • 雛形モデル(手作業)
  • 寸法表(手作業)
  • モデルの数だけ処理を繰り返すプログラム(VB)
  • モデルの形状を変更するプログラム(ジャーナル)
  • 名前を変えて保存するプログラム(ジャーナル)

これだけです。とりあえず動くことが目標です。

寸法表は、
NTN さんのサイトにPDFのカタログが公開されていました。
コピペだけでいけそうなので、ベアリングユニットUCFをサンプルとして以降進めていきます。
NTNさんベアリングユニットカタログ↓
http://www.ntn.co.jp/japan/products/catalog/pdf/rolling/needle.html

ジャーナルに、
がんばってもうらうのは、モデルの形状変更と名前を変えて保存の2つです。

モデルの変更方法は、
式のインポートを使ってみたいと思います。

次へ続きます

ジャーナル(Journal)とは?

NX3?あたりから実装された.NETベースのNXカスタムツールです。
NX ヘルプを見ると、

対話型NXセッションを記録、編集、およびリプレイする高速自動化ツールです。

と書いてあります。なんだかよくわからない説明ですが、NX版のExcel VBAと思えば良いと思います(エディタはついていませんが)。

VBAは時々作りますが、VBはVB6の頃に触っただけなので、どうかなぁと思っていますが、Google先生任せのコピペでなんとか動くものを作っていきたいと思います。ここでは、その作成手順とジャーナルファイルそのものを恥ずかしげもなく公開していきます。

まずは、CADLIBにあるParasolidデータのNX版を自動生成するジャーナルを作ってみます。
パートとCSVファイルさえあれば、汎用的に使えるジャーナルファイルを目指します。
それでは、はじめます→CADLIBデータなJournal

CADLIBモデルを自動生成するJournalでも作ってみる

NX3あたりから実装されたJournal(ジャーナル)を使って、CADLIBのデータを作成してみます。
VBA は時々作りますが、VBはVB6の頃に触っただけなので、どうなるかわかりませんが、NXのジャーナルの記録とGoogle先生任せのコピペでやっていこうと思います。