C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA(最近はPMillマクロとFusion360APIが多い)

上書き保存確認ダイアログでの判断

「SaveAsで保存する際、上書き保存確認ダイアログで
 "はい" を選択したか "いいえ" を選択したか、判断したい」
と御質問を頂きました。

SaveAsメソッドは戻り値がない為、保存前と保存後のタイムスタンプで
判断するしか方法が無いような気がします。

'vba
Sub CATMain()
    
    Dim doc As Document
    Set doc = CATIA.ActiveDocument
    
    Dim before As Date
    before = GetDateLastModified(doc.FullName)
    
    '上書きでいいえの場合エラーになる為
    On Error Resume Next
        doc.SaveAs doc.FullName
    On Error GoTo 0
    
    If before = GetDateLastModified(doc.FullName) Then
        MsgBox "保存されていません"
    Else
        MsgBox "保存されました"
    End If
    
End Sub

Private Function GetDateLastModified( _
    ByVal path As String) As Date
    
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    GetDateLastModified = fso.GetFile(path).DateLastModified
End Function

色々を確認が足りないと思いますが、一応判断出来ていると思います。
過去に、マクロで保存を行うことに対しての賛否はありましたが・・・。

PMill2019 NewVortex が削り残る

PMill2019 NewVortex テストカット中なのですが、思ったより削り残る
部分が出ます。
f:id:kandennti:20190116173351p:plain
Φ6で Z3.0  XY2.5 ステップアップ1.0mm  無理な値じゃないと思うのですが、
設定が悪いのかな?

何処かで、「薄肉が残って工具が破損した」と言う写真付きの記載を
見た覚えがあるのですが、何処か見つからず・・・。
Fusion360の負荷制御だったかな? 恐らくアルゴリズムは同じだろうから・・・。

モデリングバトル最終予選予告

こちらの続きです。
第四回仮予選!モデリングバトル予選大会 - C#ATIA

昨夜予告が出ていました。
fusion360.3dworks.co.jp

サーバーダウンにより延期されたいたのですが、延期された日の
問題が出ていました。
f:id:kandennti:20190112134112p:plain

タイムは12分ぐらいです。
もう挿すところが見当たらないので、ここにして見ました。
引きの画なら十分組めているように見えるはず・・・。

平らな傾斜面の加工を考える

こちらの動画を見てちょっと気になったので書いて見ます。
www.youtube.com
英語なのでよく理解できていないのですが、このシリーズの説明は
比較的しっかりされていると思います。



前半部分は粗加工(負荷制御3D)と仕上げ加工(走査線)を行う場合、
粗加工後カスプハイトが大きく残るので、ブルノーズ(ラジアス)を
使った方が良いよ と言う説明だろうと思います。
・・・但し、ちょっと説明が間違っているところがあります。
3:34頃に、走査線でのカスプハイトについての説明をされています。
f:id:kandennti:20190112131328p:plain
数値は違うのですがこんな感じですよね?
走査線の正しいカスプハイトの算出方法はこちらです。
f:id:kandennti:20190112131341p:plain
工具軸方向(水平)で見た際のピッチが指定ピッチになります。
最初のように傾斜した表面上でのピッチは、Fusion360の場合は
スキャロップです。
その為、同一ピッチの値をした場合、走査線よりスキャロップの方が
傾斜のゆるい部分では、若干細かいツールパスが出来上がります。
(とは言え、仕上る程の細かさの場合、ほぼ誤差レベルです)

後半部分は、ツールパスの入口出口部分にサポート面を付けた方が
良いよ と言うものです。
異論は無いのですが、CAMソフトによってはサポート面を作成しなくても
同様の動きをさせることが可能なものもあります。
こちらはPowerMillで、赤矢印部分が動きを延長させるようにしたものです。
f:id:kandennti:20190112131356p:plain
Space-eにもあったような記憶です。
Fusion360では探したのですが、この動きをさせる機能は見当たらないですね。


実は、傾斜面を仕上げる際一貫してボールエンドミルを使用する説明に
なっていましたが、傾斜が浅ければ通常のエンドミルでも仕上げる事が
可能です。その動画がこちら
www.youtube.com
YouTubeの方で見ればコメントが見れるのですが、皆「仕上がりが汚い」
と書かれていますが、ピッチを細かくすれば十分綺麗に仕上がります。
但し、僕はここもちょっと違います。

動画では傾斜を下がっていくように動いています。
f:id:kandennti:20190112131407p:plain
エンドミルは、工具の底刃を使って加工するのは不向きで、切削抵抗が
大きい場合、工具がたわみ食い込みが発生する可能性があると思っています。
出来るだけ工具の側面で加工すべきと思っているので、傾斜を駆け上がるように
しています。
f:id:kandennti:20190112131440p:plain
Fusion360の走査線の場合、こちらの赤い設定があります。
f:id:kandennti:20190112131448p:plain
ここで問題になるのは青印部分の「パス方向」です。
「切上げ加工」に設定しても、XY方向は「パス方向」に依存します。

f:id:kandennti:20190112131500p:plain
このように二つの方向に傾斜している面の場合、「パス方向」は
赤い矢印方向に設定したいのですが、この角度をどの様に探せば良い
のでしょうか?

f:id:kandennti:20190112131510p:plain
面の法線方向がわかれば良くそこから角度を調べます。
構築の「点の位置で面に垂直な軸」を使い、どこか点を指定し
加工する面を指定します。

f:id:kandennti:20190112131518p:plain
続いて、XY平面(加工軸に対して垂直な平面)にスケッチを作り
プロジェクトで先程作成した軸を投影します。
これが斜面の傾斜方向になります。これを非駆動寸法として角度を
調べておきます。(細かな数値は無視し24°としておきます)

f:id:kandennti:20190112131529p:plain
これで走査線の「パス方向」を-24°とし「切上げ加工」に設定すれば
OKです。(方向を両方向以外にし角度を調整してもOKです)
最初の動画のボールエンドミルより大きなピッチでも、十分綺麗に
仕上げる事が可能です。(要は短時間で加工出来ます)


最初の動画のような日本語のサイトって無いですね。
”ノウハウ” 的な何かを理由に表に出したくないのでしょう。

Tree順にボディ,形状セット,時系列形状セット名の取得

先日見つけたこちらのトピですが、
CATIA V5 - CATScript - Identify Order of Geometric Sets and Bodies in CATPart - DASSAULT: CATIA products - Eng-Tips
Treeに並んでいる順に、ボディと形状セット名を取得したい
と言う内容です。

検索で選択状態にすれば、Tree順に取得出来たはずなので
サンプルを作ってみたのですが、よく読んだら解決されていた
いたようでした・・・。 折角作ったので記載しておきます。

Treeに直接ぶら下がっているものだけで、子以下のものは取得しません。

'VBA Tree順にボディ,形状セット,時系列形状セット名の取得

Option Explicit

Sub CATMain()

    'start check
    If Not CanExecute("PartDocument") Then Exit Sub
    
    'doc
    Dim doc As PartDocument
    Set doc = CATIA.ActiveDocument
    
    'AllContainer
    Dim bodys As Object
    Set bodys = GetAllContainers(doc)
    If bodys Is Nothing Then
        MsgBox "Element not found", vbExclamation
        Exit Sub
    End If
    
    'LeafContainer
    Set bodys = GetLeafContainerNames(doc, bodys)
    If bodys Is Nothing Then
        MsgBox "Element not found", vbExclamation
        Exit Sub
    End If
    
    'done
    MsgBox Join(bodys.ToArray(), vbCrLf)
End Sub

Private Function GetAllContainers( _
    ByVal doc As PartDocument) As Object
    
    Set GetAllContainers = Nothing
    
    Dim sel As selection
    Set sel = doc.selection
    
    'Search
    Dim word As String
    word = "(CATPrtSearch.BodyFeature + " & _
            "CATPrtSearch.OpenBodyFeature + " & _
            "CATPrtSearch.MMOrderedGeometricalSet),in"
    
    CATIA.HSOSynchronized = False
    sel.Clear
    
    sel.Search word
    If sel.Count2 < 1 Then Exit Function
    
    Dim ary As Object
    Set ary = InitLst()
    
    Dim i As Long
    For i = 1 To sel.Count2
        ary.Add sel.Item(i).Value
    Next
    
    sel.Clear
    CATIA.HSOSynchronized = True
    
    Set GetAllContainers = ary
End Function

Private Function GetLeafContainerNames( _
    ByVal doc As PartDocument, _
    ByVal lst As Object) As Object
    
    Set GetLeafContainerNames = Nothing
    
    'Leaf HybridBodies
    Dim hBdys As Variant
    hBdys = Lst2Ary(doc.Part.HybridBodies)
    
    'Leaf OrderedGeometricalSets
    Dim odrds As Variant
    odrds = Lst2Ary(doc.Part.OrderedGeometricalSets)
    
    'is Leaf?
    Dim leafs As Object
    Set leafs = InitLst()
    
    Dim v As Variant
    For Each v In lst
        Select Case TypeName(v)
            Case "Body"
                If v.InBooleanOperation = False Then
                    leafs.Add v.Name
                End If
            Case "HybridBody"
                If UBound(filter(hBdys, GetInternalName(v))) > -1 Then
                    leafs.Add v.Name
                End If
            Case "OrderedGeometricalSet"
                If UBound(filter(odrds, GetInternalName(v))) > -1 Then
                    leafs.Add v.Name
                End If
        End Select
    Next
    If leafs.count < 1 Then Exit Function
    
    Set GetLeafContainerNames = leafs
End Function

'list2array
Private Function Lst2Ary( _
    ByVal lst As Object) As Variant

    If lst.count < 1 Then Exit Function

    Dim ary As Object
    Set ary = InitLst()
    
    Dim v As Variant
    For Each v In lst
        ary.Add GetInternalName(v)
    Next
    
    Lst2Ary = ary.ToArray()
End Function

'InternalName
Private Function GetInternalName( _
    ByVal AOj As AnyObject) As String
    If AOj Is Nothing Then
        GetInternalName = Empty
        Exit Function
    End If
    GetInternalName = AOj.GetItem("ModelElement").InternalName
End Function

'DotNet ArrayList
Private Function InitLst() As Object
    Set InitLst = CreateObject("System.Collections.ArrayList")
End Function

'OK?
Private Function CanExecute( _
    ByVal docType As String) As Boolean
    
    CanExecute = False
    
    If CATIA.Windows.count < 1 Then
        MsgBox "Please open the file", vbExclamation
        Exit Function
    End If
    
    Dim doc As Document
    Set doc = CATIA.ActiveDocument
    
    If Not TypeName(doc) = docType Then
        MsgBox docType & " Only!", vbExclamation
        Exit Function
    End If
    
    CanExecute = True
End Function

f:id:kandennti:20190112084014p:plain

Converter Center 機能していない?

機能していなさそうなものをご紹介するのもおかしな話なのですが、
時間が経ったら確認しようかなと。

CADデータ類の変換ソフト・サービス類はチョコチョコ探しています。
Aのソフトで変換し、大量に面が化けてしまい大量に修正するより、
Bのソフトで変換し、数枚の修正で済ませた方が楽ですし、
複数のソフトでエラーになれば、自信を持って「ファイルが壊れています」
と言えるので。

GrabCADに複数回紹介されていた無料のファイル変換サービスサイトが
ありました。
Online 3D Model Converter | Free 3D File Conversion | CadMeshAnalytics

名前とメアドを入力しファイルをUpすれば良いようです。
インポート可能なフォーマットが多彩で、エクスポートはこんな感じです。
f:id:kandennti:20190109110032p:plain
十分です。

紹介されていた内容では、STLファイルもStepに変換可能のようだった為、
拾ってきたSTLデータ(非圧縮)をIgesと3DPDFで送ってみました。

一日経ちましたが、何も返って来ないです!

自動的に変換してくれるシステムだと思っているのですが、
ひょっとして人力で変換しているのかな・・・。