zoukankan      html  css  js  c++  java
  • NX Open,怎样取到面的环LOOP

     在封装的ufun .NET库里面,对UF_MODL_ask_face_loops这个函数并没有封装,导致我们很多不便,那我们在.NET下怎样才能使用这个函数呢??当然是手动处理一下

     Public Function AskFaceLoops(ByVal faceTag As NXOpen.Tag) As loop_list()
            Dim loop_t As IntPtr
            NXOpen.Utilities.JAM.StartUFCall()
            Dim errorCode As Integer = UF_MODL_ask_face_loops(faceTag, loop_t)
            NXOpen.Utilities.JAM.EndUFCall()
            If errorCode <> 0 Then
                Throw NXOpen.NXException.Create(errorCode)
            End If
            Dim ptr As IntPtr = loop_t
            Dim loopList As New List(Of loop_list)
            While ptr <> IntPtr.Zero
                Dim loop_list_t As _loop_list = CType(Marshal.PtrToStructure(ptr, GetType(_loop_list)), _loop_list)
                Dim count As Integer
                errorCode = UF_MODL_ask_list_count(loop_list_t.edge_list, count)
                Dim edgeArray(count - 1) As NXOpen.Tag
                For i As Integer = 0 To count - 1
                    UF_MODL_ask_list_item(loop_list_t.edge_list, i, edgeArray(i))
                Next
                'UF_MODL_delete_list(loop_list_t.edge_list)
                loopList.Add(New loop_list With {
                             .type = loop_list_t.type,
                             .edge_list = edgeArray})
                ptr = loop_list_t.next
            End While
            UF_MODL_delete_loop_list(loop_t)
            Return loopList.ToArray()
        End Function
    
        <DllImport("libufun.dll", EntryPoint:="UF_MODL_ask_face_loops", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Ansi)> _
        Friend Shared Function UF_MODL_ask_face_loops(ByVal face As Tag, <Out> ByRef loop_list As IntPtr) As Integer
        End Function
    
        <DllImport("libufun.dll", EntryPoint:="UF_MODL_ask_list_count", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Ansi)> _
        Friend Shared Function UF_MODL_ask_list_count(ByVal list As IntPtr, <Out> ByRef count As Integer) As Integer
        End Function
    
        <DllImport("libufun.dll", EntryPoint:="UF_MODL_ask_list_item", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Ansi)> _
        Friend Shared Function UF_MODL_ask_list_item(ByVal list As IntPtr, ByVal index As Integer, <Out> ByRef [object] As Tag) As Integer
        End Function
        <DllImport("libufun.dll", EntryPoint:="UF_MODL_delete_list", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Ansi)> _
        Public Shared Function UF_MODL_delete_list(ByRef list As IntPtr) As Integer
        End Function
    
        <DllImport("libufun.dll", EntryPoint:="UF_MODL_delete_loop_list", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Ansi)> _
        Friend Shared Function UF_MODL_delete_loop_list(ByRef list As IntPtr) As Integer
        End Function
    
        Friend Structure _loop_list
            Public type As Integer
            Public edge_list As IntPtr
            Public [next] As IntPtr
        End Structure
    
        Public Structure loop_list
            Public type As Integer 'Peripheral=1, Hole=2, Other=3
            Public edge_list() As NXOpen.Tag
        End Structure
    using System;
    using System.Collections.Generic;
    using  System.Runtime.InteropServices;
    
    
        public class AskFaceLoop
        {
            public LoopList[] AskFaceLoops(NXOpen.Tag faceTag)
            {
               System.IntPtr loopT;
                NXOpen.Utilities.JAM.StartUFCall();
                int errorCode = UF_MODL_ask_face_loops(faceTag,out loopT);
                NXOpen.Utilities.JAM.EndUFCall();
                if (errorCode != 0)
                {
                    throw NXOpen.NXException.Create(errorCode);
                }
                System.IntPtr ptr = loopT;
                List<LoopList> loopList = new List<LoopList>();
                while (ptr != IntPtr.Zero)
                {
                    _loop_list loopListT = (_loop_list)Marshal.PtrToStructure(ptr, typeof(_loop_list));
                    int count;
                    errorCode = UF_MODL_ask_list_count(loopListT.edge_list,out count);
                    NXOpen.Tag[] edgeArray = new NXOpen.Tag[count];
                    for (int i = 0; i < count; i++)
                    {
                        UF_MODL_ask_list_item(loopListT.edge_list, i,out edgeArray[i]);
                    }
                    //UF_MODL_delete_list(out loopListT.edge_list);
                    loopList.Add(new LoopList{Type = loopListT.type,EdgeList = edgeArray});
                    ptr = loopListT.next;
                }
                UF_MODL_delete_loop_list(out loopT);
                return loopList.ToArray();
            }
    
            [DllImport("libufun.dll", EntryPoint = "UF_MODL_ask_face_loops", CallingConvention = CallingConvention.Cdecl,CharSet = CharSet.Ansi)]
            internal static extern int UF_MODL_ask_face_loops(NXOpen.Tag face, out IntPtr loopList);
    
            [DllImport("libufun.dll", EntryPoint = "UF_MODL_ask_list_count", CallingConvention = CallingConvention.Cdecl,
                CharSet = CharSet.Ansi)]
            internal static extern int UF_MODL_ask_list_count(IntPtr list, out int count);
    
            [DllImport("libufun.dll", EntryPoint = "UF_MODL_ask_list_item", CallingConvention = CallingConvention.Cdecl,CharSet = CharSet.Ansi)]
            internal static extern int UF_MODL_ask_list_item(IntPtr list, int index, out NXOpen.Tag @object);
    
            [DllImport("libufun.dll", EntryPoint = "UF_MODL_delete_list", CallingConvention = CallingConvention.Cdecl,CharSet = CharSet.Ansi)]
            internal static extern int UF_MODL_delete_list(out IntPtr list);
    
            [DllImport("libufun.dll", EntryPoint = "UF_MODL_delete_loop_list", CallingConvention = CallingConvention.Cdecl,CharSet = CharSet.Ansi)]
            internal static extern int UF_MODL_delete_loop_list(out IntPtr list);
    
            internal struct _loop_list
            {
                public int type;
                public IntPtr edge_list;
                public IntPtr next;
            }
    
            public struct LoopList
            {
            /// <summary>
            /// Peripheral=1, Hole=2, Other=3
            /// </summary>
            public int Type;
                public NXOpen.Tag[] EdgeList;
            }
        }
    

      

  • 相关阅读:
    hdu2795-Billboard(线段树应用好题)
    AC自动机模板
    kmp模板
    字符串Hash模板
    (可持久化)带修莫队的实现方法
    HZNU1544众数问题
    NOIP2006提高组第二题-金明的预算方案
    Python学习笔记
    (模板)唯一分解定理
    Java 7 源码学习系列(二)——Enum
  • 原文地址:https://www.cnblogs.com/bizca/p/4962559.html
Copyright © 2011-2022 走看看