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

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


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

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

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




  • Сообщения

    • streamdown
      Коллеги приветствую! IPS 8. Подскажите пожалуйста, кто какое серверное железо использует? Интересуют параметры при одновременной работе, ну например, 400 пользователей онлайн
    • gudstartup
      так он так и позиционируется по m19 pmc выдает g70.6 а чпу отвечает f45.7 но ориентацию и смещение в 4077 он отрабатывает нормально шпиндель встает ровно и смена происходит хорошо. вопрос почему после ввода команды управления скоростью он все еще продолжает контролировать число импульсов между нуль метками хотя в принципе уже должен отменить позиционный контроль и просто считать обороты по 0 метке как он это делает без М19? это все понятно но почему оно продолжает проверять это после завершения ориентации мне непонятно
    • Александр1979
      SP9047 SSPA:47 ILLEGAL SIGNAL OF POSITION CODER "The relationship between the A/B phase and 1-rotation signal is incorrect (Pulse interval mismatch)." "Неправильное значение счетчика импульсов сигнала на энкодере ALPHAi. На фазах A и B энкодера за один оборот шпинделя насчитывается 4096 импульсов обратной связи. Программное обеспечение по управлению шпинделем проверяет количество импульсов на фазах A и B, соответствующее энкодеру, при каждой генерации сигнала одного оборота. Данный аварийный сигнал срабатывает, если регистрируется число импульсов, нарушающее заданный диапазон."
    • vs3dpro
      Добрый день! У нас на есть SLA принтер 600х600х400мм. Можно напечатать мастер- модели, и можно приехать посмотреть. mail@iges.space
    • gudstartup
      после ввода 789 в edit mod надо перейти в режим ручное упр. нажать mod а потом помощь и откроется wzw.hlp  с возможностью выполнения команд управления atc. если не появляется содержимое wzw.hlp то возможно что у вас другой код хотя 789 'это стандарт для dmg в этом случае надо смотреть ваш plc раздел у меня пароль прописан в файле wzw_rett.mod
    • Anat2015
      SERVO TURRET AMP ALARM - переводить не пробовали, учитывая, что AMP - это и есть сервопривод? Что тут не ясного, язык не знаком?
    • Viktor2004
      я бы попробовал позиционировать шпиндель сигналом G70.6 Ответный сигнал, шпиндель сориентирован F45.7
    • gudstartup
      Здравствуйте уважаемые участники форума попрошу вас поделится мнениями. Имеется фрезерный шпиндель с позиционным кодером (зубчатое колесо и считывающая головка). Ошибку 9047 выдает после того отрабатывает M19 c последующим включением оборотов Sxxx M3 причем обороты могут быть любыми от 100-макс. Если задавать обороты без предварительной ориентации то 9047 не возникает и шпиндель нормально вращается на любой скорости при этом обороты не гуляют точность поддержания +-1 об\мин. Кабель заменен заменить сам датчик нет возможности. Мой вопрос в следующем почему шпиндель после M19 и включении управления скоростью Sxxx M3 остается в режиме позиционирования а не сразу переходит врежим управления скоростью и даже явная отмена ориентации кодом M20 ничего не меняет ведь режим позиционного управления должен быть отменен или он остается и отменяется не сразу после подачи команды M3 и кода скорости? Станок достаточно старый 2009 года плату управления шпинделем меняли на соседний ничего не изменилось. Это может быть логика PMC или скорее всего это датчик?   PMC-SB.001
    • Killerchik
      А мы-то думали, что пропорциональный гидравлический.....
    • Grig75
×
×
  • Создать...