VBA, VB.NET For Creo

Creo 모델 외곽 사이즈 계산 . . . 작업중

ToolBOX01 2025. 1. 5. 10:01
반응형

□ 외곽 사이즈(Outline)를 측정 필요성

설계 과정에서 외곽 사이즈(Outline)를 측정하는 것은 제품의 적합성, 제조 가능성, 효율성을 보장하기 위해 매우 중요한 역할을 합니다. 외곽 사이즈를 측정해야 하는 주요 이유는 다음과 같습니다:

1. 설계 제약 조건 충족

  • 설계 시 제품은 특정 크기 또는 공간 내에서 작동하거나 조립되어야 합니다.
  • 외곽 치수는 해당 설계가 주어진 공간 또는 장비에 적합한지 확인하는 데 필수적입니다.
    예: 기계 내부의 부품이 인클로저에 맞아야 함.
    예: 전자기기의 PCB 보드가 외부 케이스와 정확히 들어맞아야 함.

2. 제조 가능성 확인

  • 제조 장비의 가공 가능 범위를 초과하지 않도록 보장하기 위해 외곽 사이즈를 측정합니다.
    예: CNC 머신, 3D 프린터 또는 성형 기계의 최대 크기 한계를 초과하지 않아야 함.
  • 가공 재료의 크기를 초과하지 않도록 하기 위해 확인이 필요합니다.
    예: 금속 판재나 원자재 블록 크기에 맞는지 확인.

3. 비용 및 자재 절감

  • 부품의 외곽 크기를 정확히 측정하여 자재를 효율적으로 사용하고 낭비를 줄입니다.
    예: 자재 절단 후 남는 잉여 부분을 최소화하기 위해.
  • 크기가 커질수록 제조 및 운송 비용이 증가하므로, 설계 단계에서 이를 최소화할 방법을 모색할 수 있습니다.

4. 규격 및 표준 준수

  • 산업 표준이나 고객 요구사항에 따라 제품의 크기를 특정 규격에 맞춰야 합니다.
    예: 항공우주, 자동차, 의료 기기 등의 산업은 엄격한 크기 및 무게 제한을 가짐.
  • 외곽 치수는 이러한 규격 준수를 보장하는 핵심 요소 중 하나.

5. 운송 및 보관 고려

  • 제품이 운송 또는 보관 중 제한된 공간에 맞아야 하므로 외곽 크기를 미리 측정하고 최적화해야 합니다.
    예: 물류 과정에서 팔레트 크기, 컨테이너 크기 등에 적합한지 확인.
  • 크기 최적화를 통해 운송비를 절감할 수 있음.

참고 자료 . . . 

 

가로*세로*높이 사이즈 알아보기

3D 형상을 BOX 형태의 사이즈를 알아보는 프로그램 입니다. CREO에서는 대각선 사이즈는 3D point를 제공 합니다. CREO의 사이즈 계산 기능 문제점은 데이텀 커브, 데이텀 평면, 서피스를 사이즈 계산

tool-2020.tistory.com

 

□ IpfcSolid.GeomOutline

기본 좌표계를 기준으로 모델의 모든 형상(데이텀 커브. 포인트 . . .등 포함)의 외곽 사이즈를 좌표계의 X/Y/Z 방향의 길이를 측정 합니다.  가로 * 세로 * 높이 값을 고정 하려면, 모델링 표준으로 정의 해야 합니다 (예지: X축 가로, Y축 세로, Z축 높이) 메인 프로그램은 1개의 SUB()와 1개의  Function을 호출 합니다

 

1. Sub CreoConnt01()

Option Explicit
Public asynconn As New pfcls.CCpfcAsyncConnection
Public conn As pfcls.IpfcAsyncConnection
Public BaseSession As pfcls.IpfcBaseSession
Public Model As pfcls.IpfcModel
Public Sub CreoConnt01()
     
     '// connect creo model
     Set conn = asynconn.Connect(Null, Null, Null, Null)
     Set BaseSession = conn.Session
     Set Model = BaseSession.CurrentModel
     
    '// creo model connection check
     If Model Is Nothing Then
        MsgBox "There are No Active Creo Models", vbInformation, "korealionkk@gmail.com"
        Exit Sub
     End If
               
End Sub

 

2. Function CurrentOutline()

Public Function CurrentOutline() As Variant
    Dim Solid As pfcls.IpfcSolid
    Dim outline(2) As Double
    Dim x1 As Double, x2 As Double, y1 As Double, y2 As Double, z1 As Double, z2 As Double
    
    Set Solid = Model

    ' GeomOutline 값을 계산
    x2 = Solid.GeomOutline.Item(1).Item(0)
    x1 = Solid.GeomOutline.Item(0).Item(0)
    y2 = Solid.GeomOutline.Item(1).Item(1)
    y1 = Solid.GeomOutline.Item(0).Item(1)
    z2 = Solid.GeomOutline.Item(1).Item(2)
    z1 = Solid.GeomOutline.Item(0).Item(2)

    outline(0) = Abs(x2 - x1)
    outline(1) = Abs(y2 - y1)
    outline(2) = Abs(z2 - z1)

    ' 결과 반환
    CurrentOutline = outline
End Function

3.   Sub  modelsize01()

Option Explicit
Sub modelsize01()
    On Error GoTo RunError
    Application.EnableEvents = False
    Dim myModelOutline As Variant

    '// Module Name : CreoVBAStart
    Call CreoVBAStart.CreoConnt01
    
    myModelOutline = CurrentOutline.CurrentOutline()
    
    MsgBox "Length in X direction : " & myModelOutline(0), vbInformation, "korealionkk@gmail.com"
    MsgBox "Length in Y direction : " & myModelOutline(1), vbInformation, "korealionkk@gmail.com"
    MsgBox "Length in Z direction : " & myModelOutline(2), vbInformation, "korealionkk@gmail.com"
    
      conn.Disconnect (2)
      
    '// Cleanup
    Set asynconn = Nothing
    Set conn = Nothing
    Set BaseSession = Nothing
    Set Model = Nothing
    
RunError:
            If Err.Number <> 0 Then
                MsgBox "Process Failed: An error occurred." & vbCrLf & _
                       "Error No: " & CStr(Err.Number) & vbCrLf & _
                       "Error Description: " & Err.Description & vbCrLf & _
                       "Error Source: " & Err.Source, vbCritical, "Error"
                If Not conn Is Nothing Then
                    If conn.IsRunning Then
                        conn.Disconnect (2)
                    End If
                End If
            End If
End Sub

□ IpfcSolid.EvalOutline

Function EvalOutline(Trf As IpfcTransform3D [optional], ExcludeTypes As IpfcModelItemTypes [optional]) As IpfcOutline3D
  • 기능: 솔리드(Solid) 객체의 외곽선을 계산합니다.
  • 매개변수:
    1) Trf (IpfcTransform3D, 선택적): 외곽선을 계산할 기준 좌표계에 대한 변환 행렬입니다.
    2) ExcludeTypes (IpfcModelItemTypes, 선택적): 외곽선 계산에서 제외할 모델 항목 유형의 배열입니다.
       제외할 수 있는 유형은 ITEM_COORD_SYS, ITEM_AXIS, ITEM_POINT입니다.
  • 반환값:
    IpfcOutline3D 객체입니다. 이 객체는 솔리드의 경계를 정의하는 두 개의 점을 포함합니다.

이 함수는 지정된 좌표계 변환(Trf)과 제외할 항목 유형(ExcludeTypes)을 기반으로 솔리드 객체의 외곽선을 계산하고, 그 결과를 IpfcOutline3D 객체로 반환합니다.

IpfcTransform3D: 3D 변환을 나타내는 인터페이스입니다. 좌표계 변환, 회전, 이동 등을 표현할 수 있습니다.
아래 코드는 정상적으로 값을 가져 오지 못합니다. 모델이 +/- 영역에 있어야 값을 정확히 가져 옵니다.

Sub modelsize02()
    On Error GoTo RunError
    Application.EnableEvents = False
    Dim myModelOutline As Variant
    
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("modelsize")

    '// Module Name : CreoVBAStart
    Call CreoVBAStart.CreoConnt01
    
    Dim solid As IpfcSolid
    Dim outline3d As IpfcOutline3D
    Dim excludeTypes As IpfcModelItemTypes
    Dim Transform3D As IpfcTransform3D
    Dim Point3D As IpfcPoint3D
    Dim boundingBox(5) As Double
    Dim targetValue As Double
    
    Set solid = Model
    
    ' Transform3D 초기화
    Set Transform3D = Nothing
    
    Set excludeTypes = New CpfcModelItemTypes
    excludeTypes.Append (EpfcModelItemType.EpfcITEM_AXIS)
    excludeTypes.Append (EpfcModelItemType.EpfcITEM_COORD_SYS)
      
    Set outline3d = solid.EvalOutline(Transform3D, excludeTypes)
    
    Dim i, j, k As Integer
    k = 0
    
    For i = 0 To 1
         Set Point3D = outline3d.Item(i)
         For j = 0 To 2
              k = i * 3 + j
              boundingBox(k) = Point3D.Item(j)
         Next j
    Next i
    
    targetValue = 0.5937171043591
    
    ws.Cells(6, "B") = Model.fileName

    ' 배열 요소 순회하며 값 변경
     For i = 0 To 5
     
          If boundingBox(i) > 0 Then
             boundingBox(i) = Round(boundingBox(i) - targetValue, 4)
          Else
             boundingBox(i) = Round(boundingBox(i) + targetValue, 4)
          End If
          
     Next i
    
    ws.Cells(8, "A") = Abs(boundingBox(3) - boundingBox(0))
    ws.Cells(8, "B") = Abs(boundingBox(4) - boundingBox(1))
    ws.Cells(8, "C") = Abs(boundingBox(5) - boundingBox(2))
    
     conn.Disconnect (2)
    
    '// Cleanup
    Set asynconn = Nothing
    Set conn = Nothing
    Set BaseSession = Nothing
    Set Model = Nothing
    
RunError:
            If Err.Number <> 0 Then
                MsgBox "Process Failed: An error occurred." & vbCrLf & _
                       "Error No: " & CStr(Err.Number) & vbCrLf & _
                       "Error Description: " & Err.Description & vbCrLf & _
                       "Error Source: " & Err.Source, vbCritical, "Error"
                If Not conn Is Nothing Then
                    If conn.IsRunning Then
                        conn.Disconnect (2)
                    End If
                End If
            End If
End Sub

Sub deletecaell01()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("modelsize")
    
    ws.Range("B6:C6").ClearContents
    ws.Rows("8:" & ws.Rows.Count).ClearContents

End Sub

 

 

참고

 

 

Vb api: how to modify points coordinates?

Hi,   I'm using vba to modify points in a .prt file. Up to now I can read their coordinates, but I cannot change them. I thought the lines in red would do the job, but VBA seems to not recognize this command...   Sub test()   Dim asynconn As New pfcls.C

community.ptc.com

 

 

 


외곽 사이즈 측정은 1개의 파일만 대상으로 사용하지 않습니다. 수많은 Creo 파일을 자동으로 외곽 사이즈 측정을 해야 합니다. 이것을 구현 하기 위해서는 데이터베이스가 요구 됩니다.

데이터베이스(DB)는 여러 사람이 공유하여 사용할 수 있도록 체계화하여 통합, 관리하는 데이터의 집합입니다. 
데이터베이스는 데이터를 쉽게 액세스하고 관리, 수정, 업데이트, 제어, 구성할 수 있도록, 일련의 
테이블에서 행과 열로 모델링됩니다. 

데이터베이스의 특징은 다음과 같습니다. 
1.실시간 접근: 사용자의 데이터 요구에 실시간으로 응답합니다.
2.계속 변화: 데이터의 계속적인 삽입, 삭제, 수정을 통해 현재의 정확한 데이터를 유지합니다.
3.동시 공유: 서로 다른 데이터의 동시 사용 뿐만 아니라 같은 데이터의 동시 사용도 지원합니다.

외곽 사이즈 측정은 단순히 크기를 확인하는 작업이 아니라, 제품이 설계 의도와 제약 조건을 충족하도록 보장하는 중요한 과정입니다. 이를 통해 설계 오류를 예방하고, 제조 공정의 효율성을 높이며, 최종적으로 제품 품질을 향상시킬 수 있습니다.

by korealionkk@gmail.com