Jump to content

Преобразование смежных ребер в аналитическую кривую


Recommended Posts

Teliatni

Задача следующая. При выборе грани объекта извлечь параметры грани и ребер, а также преобразовать смежные ребра грани в аналитическую кривую. С помощью функции Eval.Initialize я запускаю инициализатор, далее необходимо использовать функцию Eval.AskSpline, но я не понимаю, какие параметры необходимо ей передать, возникают конфликты связанные с типом данных (должны быть NXOpen.Tag и System.IntPtr, всего 2 параметра). Если у кого-то есть пример кода или может помочь, буду очень благодарен. Код могу предоставить для лучшего понимая вопроса.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NXOpen;
using NXOpen.Utilities;
using NXOpen.UF;
using NXOpenUI;

namespace FeatureExtraction
{

    public class Class1
    {
        Session session = Session.GetSession();
        static UFSession uFSession = UFSession.GetUFSession();
        private static Tag lastSelectedTag;
        public static void Main(string[] args)
        {
            UFUi.SelInitFnT selInitFnT = new UFUi.SelInitFnT(selectionParams);
            int scope = UFConstants.UF_UI_SEL_SCOPE_WORK_PART;
            IntPtr intPtr = IntPtr.Zero;
            int outPut;
            double[] position = new double[3];
            uFSession.Ui.SelectWithSingleDialog("Single Dialog Test", "Select Any Face", scope, selInitFnT, intPtr, out outPut, out Tag tag, position, out Tag viewtag);
            if (outPut == UFConstants.UF_UI_OBJECT_SELECTED)
            {
                Tag selectedTag = tag;
                if (lastSelectedTag == selectedTag) // Если выбрана та же грань, что и ранее
                {
                    lastSelectedTag = Tag.Null; // Сбрасываем значение последней выбранной грани
                    Guide.InfoWriteLine("Selection canceled by user."); // Сообщаем об отмене выбора пользователем
                }
                else // Если выбрана другая грань
                {
                    lastSelectedTag = selectedTag; // Сохраняем выбранную грань как последнюю выбранную
                    AskFaceData(selectedTag); // Выводим информацию о выбранной грани
                    uFSession.Eval.Initialize(lastSelectedTag, out var evalObj);
                }
            }
            else if (outPut == UFConstants.UF_UI_CANCEL)
            {
                Guide.InfoWriteLine("Selection canceled by user.");
            }
        }
        static int selectionParams(IntPtr select, IntPtr userData)
        {
            int num_masks = 2;
            UFUi.Mask[] masks = new UFUi.Mask[2];
            masks[0].object_type = UFConstants.UF_face_type;
            masks[0].object_subtype = 0;
            masks[0].solid_type = 0;
            masks[1].object_type = UFConstants.UF_edge_type;
            masks[1].object_subtype = 0;
            masks[1].solid_type = 0;
            uFSession.Ui.SetSelMask(select, UFUi.SelMaskAction.SelMaskClearAndEnableSpecific, num_masks, masks);
            return UFConstants.UF_UI_SEL_SUCCESS;
        }
        public static void AskFaceData(Tag faceTag)

        {
            UFSession theUfSession = UFSession.GetUFSession();
            double[] position = new double[3];
            double[] dir = new double[3];
            double[] box = new double[6];
            double radius;
            theUfSession.Modl.AskFaceData(faceTag, out int type, position, dir, box, out radius, out double rad_datat, out int norm_dir);
            string dirStr = string.Join(",", dir);
            string positionStr = string.Join(",", position);
            string boxStr = string.Join(",", box);
            string radiusStr = string.Join(",", radius);
            string rad_datatStr = string.Join(",", rad_datat);
            string norm_dirStr = string.Join(",", norm_dir);
            string typeStr = string.Join(",", type);
            Guide.InfoWriteLine("Type: " + type);
            Guide.InfoWriteLine("Position: " + string.Join(", ", position));
            Guide.InfoWriteLine("Direction: " + string.Join(", ", dir));
            Guide.InfoWriteLine("Bounding Box: " + string.Join(", ", box));
            Guide.InfoWriteLine("Radius: " + radius);
            Guide.InfoWriteLine("Radial Data: " + rad_datat);
            Guide.InfoWriteLine("Normal Direction: " + norm_dir + "\n");
        }
        public static void Edges(Tag faceTag)
        {
            UFSession theUfSession = UFSession.GetUFSession();
            NXOpen.TaggedObject taggedObject = NXOpen.Utilities.NXObjectManager.Get(faceTag) as NXOpen.TaggedObject;
            if (taggedObject is NXOpen.Face)
            {
                NXOpen.Face face = (NXOpen.Face)taggedObject;
                Edge[] edges = face.GetEdges();
                Guide.InfoWriteLine("**Punkten einer Fläche**\n");

                for (int i = 0; i < edges.Length; i++)
                {
                    Point3d start_point, end_point;
                    edges[i].GetVertices(out start_point, out end_point);
                    string start_pointStr = string.Join(",", new double[] { start_point.X, start_point.Y, start_point.Z });
                    string end_pointStr = string.Join(",", new double[] { end_point.X, end_point.Y, end_point.Z });
                    Guide.InfoWriteLine("Edge " + i + " start point: " + start_pointStr);
                    Guide.InfoWriteLine("Edge " + i + " end point: " + end_pointStr);
                    // Извлекаем тег ребра
                    Tag edgeTag = edges[i].Tag;
                    Guide.InfoWriteLine("Edge " + i + " tag: " + edgeTag.ToString());
                }
            }
            else
            {
                Guide.InfoWriteLine("Selected tag is not a face.");
            }
        }


        public static int GetUnloadOption(string arg)
        {
            return System.Convert.ToInt32(Session.LibraryUnloadOption.Immediately);
        }
    }
}

Link to post
Share on other sites


UnPinned posts
Ug_user

"Я бы хотел поймать на болоте лягушку, и чтоб она в царевну превратилась" - вот примерно так это можно перевести. 
Дружище, даже если ты возьмешь сплайн, и "ощупаешь" его и получишь все его весовые коэффициенты, координаты полюсов, точки склеивания и т.п. - то надо где-то раздобыть волшебную палочку, взмахом которой это все превратится в аналитическую кривую x=x(t), y=y(t), z=z(t). Во-первых - это не всегда возможно. во-вторых - представь себе, тебе попалась чистой воды окружность x=R*cos(t), y=R*sin9t), z=0.0. По тем данным, что-ты получишь из данных о сплайне - да ни в жисть не восстановишь эти простые уравнения. Конечно, у любого NURBS-сплайна есть аналитическое представление, но это немного многоэтажные формулы. 
В общем - не сильно простая задачка.

 

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.




×
×
  • Create New...