参照スケッチとエンティティ変換の違い

 

大きな違いは「投影対象」。対象がスケッチとエンティティ/要素の違いです。参照スケッチはスケッチ単位で強固な関連付けです。エンティティ変換は線、点(エンティティ/要素)単位の拘束です。拘束は削除できます。

参照スケッチは、エンティティ変換/要素変換でも可能というか、基本、エンティティ変換を使うのが普通でしょう。平行の場合だけ。形状からスケッチが欲しい時に使うのがほとんどです。次の動画みたいなことしませんよね。

で、参照スケッチがいいのは、

あらぬ方向、位置へのスケッチをしたい場合はスケッチ全体をコピーし関連付ける。

だから、寸法の共有とか標準化という考えで作るものです。標準化?した参照スケッチから複数のフィーチャーを作るとか。

「きょう」入力、変換で20240919

GoogleのIMEは、きょう、いま、で変換すると今日の日付や今の時間に変換してくれる。前にも書いてます。

ですが、表題のようにyyyymmddはできませんでした。次図のように辞書に入力するとこの形式で変換します。コピー用に下に張り付けておきます。

DATE_FORMAT
{YEAR}{MONTH}{DATE}

こちらを参考にしました。

{YEAR}{MONTH}{DATE}を工夫すれば0919や09/19はできるのはできますが、「よみ」の項目にDATE_FORMATは1つしか認識しないようです。だから、いろんな種類、20240919とか09/19とか複数行に登録しても無駄でした。もしかして、品詞を変えたらどうか?。やってみたらやはり1つだけです。品詞なしが優先かも。それに曜日の{WEEK}とは使えません。

今日の日付は日に1回変わるだけなのでコマンドラインで実行できればいいなー。ってGoogleIMEのGoogleIMEJaTool.exeにコマンドラインで使えるオプションに/importとか/exportとか/exportdicとかのオプションがあるか探しました。ありません。

でも、

240919や9/19木、0919と複数の候補がほしい。

クリップボードに作るという方法ならできそうです。

C:\Users\take2>type tt.bat
powershell -ExecutionPolicy Bypass ./today2.ps1

C:\Users\take2>type today2.ps1
$text = Get-Date -Format "yyMMdd"
$text= $text -replace "\s",""
Set-Clipboard $text

C:\Users\take2>type mm.bat
powershell -ExecutionPolicy Bypass ./mmddaaa.ps1

C:\Users\take2>type mmddaaa.ps1
$text = Get-Date -Format "MMdd ddd"
$text= $text -replace "\s",""
Set-Clipboard $text

コマンドプロンプトでttと入力し、実行したら240919がクリップボードにできます。

コマンドプロンプトでmmと入力し、実行したら0919木がクリップボードにできます。

こちらを参考にしました。

参照ジオメトリの重心

フィーチャーがある時は、参照ジオメトリに「重心」と「合致参照」が増えます。背の高い製品を設計する時は重心を表示します。

フィーチャーが無いと「使えない」色になっているなら「重心」の存在を意識できるが、「平面」から「点」」までしか存在しません。Solidworksさん「重心」使えない色にして常に表示してください。

重心の位置をスケッチで使う場合、「重心参照点」をフィーチャーツリーに追加します。「重心参照点」はフィーチャーですからこれを使ってスケッチする場合は参照ジオメトリの平面を作ります。スケッチで「重心参照点」と直線の端を一致させることができます。つまり、拘束も使える。

赤い矢印が「重心参照点」フィーチャーです。

話は変わって、重心位置に点を表示するマクロです。参照ジオメトリの原点があれば十分でしょう。CharGPTならすぐできるだろうとやってみたが、部品表はすぐできたが、調子に乗っていろいろ要求したので結構時間がかかった。部品表のマクロの時は、Solidworksマクロってマイナーすぎてどうせできないだろって思って、コマメにコードを書いてもらってからまとめるという方法だったかあな。質問は10回程度だった。いい時代です。プログラムってちょっとしたことを確認するだけで時間がかかるし、コードを書く時間も。書く手間が省けるだけですごいが、コピペで使える。

平面に平行な参照ジオメトリの平面を作って、そこに点をスケッチする。評価の質量特性で重心が一時的に表示されるので正しくスケッチされているか確認して下さい。

Option Explicit

Dim swApp As Object
Dim Part As Object
Dim MassProp As MassProperty
Dim MassCenter(2) As Double
Dim RefPlaneFeature As Object
Dim SketchMgr As Object
Dim SketchPoint As Object

Sub main()

    ' SolidWorksアプリケーションへの接続
    Set swApp = Application.SldWorks
    Set Part = swApp.ActiveDoc
    If Part Is Nothing Then
        MsgBox "モデルが開いていません"
        Exit Sub
    End If
    
    ' 質量プロパティオブジェクトを取得
    Set MassProp = Part.Extension.CreateMassProperty
    If MassProp Is Nothing Then
        MsgBox "質量プロパティを取得できませんでした。"
        Exit Sub
    End If
    
    ' 重心の位置を取得
    MassCenter(0) = MassProp.CenterOfMass(0) ' X座標
    MassCenter(1) = MassProp.CenterOfMass(1) ' Y座標
    MassCenter(2) = MassProp.CenterOfMass(2) ' Z座標
    
    '正面を選択
    Dim boolstatus As Boolean
    boolstatus = Part.Extension.SelectByID2("正面", "PLANE", 0, 0, 0, True, 0, Nothing, 0)

    ' 平面を挿入
    Set RefPlaneFeature = Part.FeatureManager.InsertRefPlane(swRefPlaneReferenceConstraint_Distance, MassCenter(2), 0, 0, 0, 0)

    If RefPlaneFeature Is Nothing Then
        MsgBox "参照平面の作成に失敗しました。"
        Exit Sub
    End If
    
    ' スケッチマネージャーを取得
    Set SketchMgr = Part.SketchManager
    
    ' 作成した参照平面を選択
    RefPlaneFeature.Select False
    
    ' 新しいスケッチを開始
    SketchMgr.InsertSketch True
    
    ' 重心の位置に点を作成
    Set SketchPoint = SketchMgr.CreatePoint(MassCenter(0), MassCenter(1), MassCenter(2))
    
    ' スケッチを閉じる
    SketchMgr.InsertSketch True
    
    MsgBox "重心の位置を通過する参照ジオメトリ平面上に点がスケッチされました。"

End Sub

図面の部品表をExcelファイルに保存するSolidworksのマクロ

これは、開いている図面で実行すると部品表/BOM(Bill Of Materials)をExcelファイルで保存します。Excelのファイル名は図面のファイル名と同じです。図面ファイルと同じフォルダに保存します。Excelのマクロも使ってます。

部品表のExcelファイルを移動して発注などに使っても図面の関係がわかるようにA1セルに図面ファイルのフルパスのファイル名を入れています。

完了したら、Solidworksでは完了のメッセージを開き、Windowsエクスプローラーで保存したExcelのファイルがあるフォルダを開きます。

Sub drdBOM_xls()

    ' SolidWorksアプリケーションのインスタンスを取得
    Dim swApp As SldWorks.SldWorks
    Set swApp = Application.SldWorks

    ' アクティブなドキュメントを取得
    Dim swModel As SldWorks.ModelDoc2
    Set swModel = swApp.ActiveDoc

    If swModel Is Nothing Then
        MsgBox "アクティブなドキュメントが見つかりません。"
        Exit Sub
    End If

    ' 部品表を保持する変数
    Dim swTable As SldWorks.TableAnnotation
    Dim foundBOM As Boolean
    foundBOM = False

    ' 図面シートまたはビューを取得し、すべてのビューを巡回
    Dim swView As SldWorks.View
    Set swView = swModel.GetFirstView

    Do While Not swView Is Nothing
        ' 各ビュー内のテーブル注釈を取得
        Dim swTableAnn As SldWorks.TableAnnotation
        Set swTableAnn = swView.GetFirstTableAnnotation

        ' テーブルアノテーションを巡回
        Do While Not swTableAnn Is Nothing
            ' 部品表かどうか確認
            If swTableAnn.Type = swTableAnnotationType_e.swTableAnnotation_BillOfMaterials Then
                Set swTable = swTableAnn
                foundBOM = True
                Exit Do
            End If
            Set swTableAnn = swTableAnn.GetNext
        Loop
        
        If foundBOM Then Exit Do
        Set swView = swView.GetNextView
    Loop

    ' 部品表が見つからなかった場合
    If Not foundBOM Then
        MsgBox "部品表が見つかりませんでした。"
        Exit Sub
    End If

    ' Excelアプリケーションのインスタンスを作成
    Dim xlApp As Object
    Dim xlBook As Object
    Dim xlSheet As Object
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Add
    Set xlSheet = xlBook.Sheets(1)

    ' Excelを表示
    xlApp.Visible = True

    ' 正規表現オブジェクトを作成してHTMLタグを削除する
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")
    regex.Global = True
    regex.IgnoreCase = True
    regex.Pattern = "<[^>]+>" ' HTMLタグにマッチするパターン

    ' 部品表の行数と列数を取得
    Dim rowCount As Long
    Dim colCount As Long
    rowCount = swTable.rowCount
    colCount = swTable.ColumnCount

    ' 部品表データをExcelに転送
    Dim i As Long, j As Long
    Dim rawText As String
    Dim cleanText As String
    For i = 0 To rowCount - 1
        For j = 0 To colCount - 1
            rawText = swTable.DisplayedText(i, j)
            '0001先頭が0から始まる文字を数値にしないために’を入れてセルで文字列にする
            If Left(rawText, 1) = "0" Or Left(rawText, 1) = "0" Then rawText = "'" & rawText
            ' HTMLタグを削除
            cleanText = regex.Replace(rawText, "")
            xlSheet.Cells(i + 1, j + 1).Value = cleanText
        Next j
    Next i
    'A1に図面のフォルダ名+ファイル名をコメントで追加
    xlSheet.Range("A1").AddComment swModel.GetPathName
    'Excelで保存するために図面のフルパス+ファイル名の拡張子だけを削除
    Dim ss As String
    ss = Mid(swModel.GetPathName, InStrRev(swModel.GetPathName, "."))
    ss = VBA.Replace(swModel.GetPathName, ss, "")
    
    ' Excelファイルの保存
     ' 警告を無効にする
    xlApp.Application.DisplayAlerts = False
    xlBook.SaveAs ss 'Excelファイルの保存
    'xlBook.SaveAs ss & ".csv"  'CSVファイルの保存。テキストです
     ' 警告を無効にする
    xlApp.Application.DisplayAlerts = True
    xlApp.Quit  'Excel終了

    ' クリーンアップ
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing

    MsgBox "部品表がExcelにエクスポートされました。"
    ' エクスプローラーでExcelで保存したフォルダを開く
    ss = Mid(swModel.GetPathName, InStrRev(swModel.GetPathName, "\"))
    ss = VBA.Replace(swModel.GetPathName, ss, "")
    Shell "explorer.exe " & ss, VBA.vbNormalFocus
End Sub

とりあえずの状態ですが、いずれあるフォルダ以下にある全図面ファイルの部品表を自動的にExcelファイル保存するマクロ/コードを書きたいと思います。やっぱ自動化ですよね。DX(デジタルトランスフォーメーション)っていうやつです。

拡張子dotの意味

ソリッドワークス/SolidWorksでテンプレートを保存する時に何でdotなん????って思ってました。prt,asm,drwはいいのですが続くdot。

  • 部品の拡張子が*.prtdot
  • アセンブリの拡張子が*.asmdot
  • 図面の拡張子が*.drwdot

WordでもNormal.dotとかマクロ付きはNormal.dotmというテンプレートファイルがあるようです。これでピント!きた。予想ですが、

DOcument Templatesの略ではないかと?

SolidWorksの部品のテンプレート保存。Part Template

SolidWorksのアセンブリのテンプレート保存。Assembly Templates

SolidWorksの図面のテンプレート保存。これだけ日本語ね。図面テンプレート

ところで、

テンプレートは、ドキュメントプロパティとファイルプロパティのどちらも保存できる。特に、ファイルプロパティには重量と材料は追加しておきましょう。部品表を作る時に便利ですから。

下図の信号機の右がファイルプロパティ、その右がシステムプロパティとドキュメントプロパティ。

SolidWorks仕事始めファイルで設定、テンプレート

テンプレートとは日本語で型という意味です。テンプレートは、コンピュータの世界では実体はファイルでしょう。ファイルとしていろいろなことを設定できます。

まず、システムオプションです。これはテンプレートではありませんが、Solidworksの設定です。

さらに

テンプレートとといえばドキュメントテンプレートと部品表、図面シートでしょう。ドキュメントテンプレートは、部品、アセンブリ、図面の3種類があります。

「システムオプション」の「ファイル検索」には下図のように多くのテンプレートというファイルがあります。

この中にはフォルダが設定されてない空白なものもあります。例えば、「参照ドキュメン」です。使わないから空白なのです。

コマンドの実行ファイルがどこにあるか調べる。Whereが使える

知らんかったわ。以下はcmd、コマンドプロンプトです。notepadが実際にあるフォルダの位置がわかります。

C:\Users\take2>where notepad
C:\Windows\System32\notepad.exe
C:\Windows\notepad.exe

C:\Users\take2>where terapad
C:\Program Files (x86)\TeraPad\TeraPad.exe