Перейти к публикации

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


Рекомендованные сообщения

Задача следующая. При выборе грани объекта извлечь параметры грани и ребер, а также преобразовать смежные ребра грани в аналитическую кривую. С помощью функции 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);
        }
    }
}

Ссылка на сообщение
Поделиться на других сайтах


UnPinned posts

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

 

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




×
×
  • Создать...