2010年4月26日月曜日

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

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のところ)の後に、形状変更と名前を変えて保存のそれぞれのジャーナルを追加しておけば、動くはずです!

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

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


次へ続きます

0 件のコメント:

コメントを投稿