Официальный форум российского программного комплекса T-FLEX PLM


Поиск  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 След.
[ Закрыто] Как узнать куда направлена нормаль - внутрь или наружу, Вопросы, возникающие при вставке 3D фрагмента
 
Vite,да, с этим я уже разобралась. На шаг раньше нормаль получать просто нужно, с ModelFace, а не PlaneSurface.
В класс, описывающий вставляемый элемент, хотела добавить свойство типа ModelFace и хранить ссылку на поверхность, на которую вставляется элемент. Только вот при выполнении выдается ошибка "Объект был удален. Ссылки на объекты модели не должны сохраняться". Получается, что просто сохранить и передавать ссылку на грань я не могу?
Изменено: Batarejka - 21.10.2015 09:34:43
[ Закрыто] Как узнать куда направлена нормаль - внутрь или наружу, Вопросы, возникающие при вставке 3D фрагмента
 
Когда я пытаюсь сделать следующее
pointsLCS.DirectionToAxisX = SelectedPlane.Plane.Normal;

То получаю ошибку невозможно преобразовать BaseDirection к ModelDirection.
Как все это делать руками я прекрасно вижу. Но если абстрагироваться от этого и представить, что есть только три выбранные грани и расстояния от двух. И вот как тут построить правильно ЛСК. Хочу ось Z перпендикулярно грани, а не X :nono: Хотя уже и на Х согласна, лишь бы всегда перпендикулярно и от тела была направлена.
[ Закрыто] Как узнать куда направлена нормаль - внутрь или наружу, Вопросы, возникающие при вставке 3D фрагмента
 
Ага, спасибо, туда я почему-то не долезла. Но, все равно остается открытым вопрос с этим кодом.
Цитата
Vite написал:
//pointsLCS.DirectionToAxisX = /* Направление оси X (грань) */
//pointsLCS.DirectionToAxisY = /* Направление оси Y (ребро) */
Собственно сами значения какие указывать? У меня по факту есть три выбранные грани PlaneSurface. Как инфу из них можно использовать для направления осей в нужную мне сторону.
[ Закрыто] Как узнать куда направлена нормаль - внутрь или наружу, Вопросы, возникающие при вставке 3D фрагмента
 
Цитата
Vite написал:
Вы создаете 3D узел по аналогии с операцией "По граням и смещениям", или что-то другое?
ммм, ну по факту так и получается, грань, накоторой эта точка будет и потом расстояния от других граней, все это потом через пересчет в ГСК и постановка точки в этих координатах. Просто расчеты не приводила тут, а сразу задание точки.
[ Закрыто] Как узнать куда направлена нормаль - внутрь или наружу, Вопросы, возникающие при вставке 3D фрагмента
 
Вот не обязательно вычитание. Отверстие - это как пример, а могут быть и более сложные элементы, а также не только вычитание, но и сложение.
[ Закрыто] Как узнать куда направлена нормаль - внутрь или наружу, Вопросы, возникающие при вставке 3D фрагмента
 
Собственно последовательность действий, я уже описала выше:

Цитата
Batarejka написал:
Прогаммно делается так:
1. Строится точка, в которой будет вставлен 3D фрагмент (например, отверстие)
2. В этой точке создается ЛСК, к которой он будет привязан
3. Вставляется фрагмент
4. Привязывается к построенной ЛСК
5. Вычитается из тела.
И вот как происходит. В моем меню есть пункт "Вставить КТЭ". Я нажимаю на него и происходит следующий диалог с пользователем:
- Выберите грань для расположения КТЭ - ожидание выбора
- Выберите первую грань для привязки КТЭ - ожидание выбора, после выбора задание расстояния, на котором от этой грани расположен КТЭ
- Выберите вторую грань для привязки КТЭ - аналогично предыдущему пункту
Всё!
И вот как только пользователь это сделал, у меня есть нормали выбранных граней. На моих рисунках есть эти значения. Так вот, получается, что нормаль может быть направлена и внутрь тела (верхняя грань, нормаль 0,0-1). А я хочу, чтобы ось Z создаваемой мной ЛСК для КТЭ была параллельна нормали плоскости привязки, но обязательна направлена вне тела.

По факту задачу можно сформулировать так: Как программно построить ЛСК на плоскости, чтобы ось Z была перпендикулярна ей и направлена вне тела?
Код
//нормаль и точка на выбранной грани
var pSurf = modelFace.Surface as PlaneSurface;
if (pSurf != null)
{
    pt = pSurf.Plane.Origin;
    dir = pSurf.Plane.Normal;
}
//точка для ЛСК, координаты для положения вычисляются после выбора всех граней
var nd3D = new CoordinateNode3D(currentDocument)
{
    X = otLSK.Geometry.Origin.X*1000,
    Y = otLSK.Geometry.Origin.Y*1000,
    Z = otLSK.Geometry.Origin.Z*1000
};
//ЛСК для КТЭ                   
var lks = new PointsLCS(currentDocument)
{
    Name = insKTE.LSKname,
    Color = 13,
    PointToOrigin = nd3D.Geometry.Point
};
//доворот ЛСК
var transformations = lks.Transformations.AddBaseTransfGroup();
transformations.SetLCS(otLSK, false);
transformations.TransfContainer.SourceCSType = TransformationLCSType.CenterOfBoundBox;
transformations.Name = insKTE.Name + "_MoveRotate";

и вот тут нужно понять, как перевернуть оси.
Я уже не знаю, как это еще объяснить, если опять не понятно.
[ Закрыто] Как узнать куда направлена нормаль - внутрь или наружу, Вопросы, возникающие при вставке 3D фрагмента
 
Вот в этом то вся и фишка, что нет.
На рисунке значения нормалей 3 поверхностей, параллельных друг другу, 3-я грань - самая нижняя в детали, не видна просто. На надпись "ребра" не обращайте внимания, просто осталось со старого кода. И в голову приходит только идея сместить точку (или создать новую, там уже по ходу разобраться, как проще), в которой построена ЛСК, на миллиметр вдоль ее оси Z и проверять, находится ли она в теле. Если нет, то направление правильное, иначе перевернуть ось.
Код
var pSurf = modelFace.Surface as PlaneSurface;
if (pSurf != null)
{
    pt = pSurf.Plane.Origin;
    dir = pSurf.Plane.Normal;
}
Изменено: Batarejka - 14.10.2015 14:56:51
[ Закрыто] Как узнать куда направлена нормаль - внутрь или наружу, Вопросы, возникающие при вставке 3D фрагмента
 
Собственно в процессе построения ось Z ЛСК ориентируется параллельно нормали плоскости и задача сейчас заключается в том, чтобы понять, куда эта нормаль направлена, внутрь тела или наружу. Визуально это понятно, как довернуть в случае чего оси, но в моем случае все должно происходить автоматически и быть скрыто от пользователя. Он просто тычет на грань, указывает на каком расстоянии от какой грани и все.
[ Закрыто] Как узнать куда направлена нормаль - внутрь или наружу, Вопросы, возникающие при вставке 3D фрагмента
 
Цитата
Vite написал:
Если я правильно понимаю, есть некий 3D объект, относительно которого необходимо вставить 3D фрагмент с вычитанием.
По сути да. У меня длл, где есть команда меню "Вставить КТЭ". Затем происходит его привязка, а именно выбор плоскости, на которой он будет расположен, и грани, от которых задаются расстояния до КТЭ, например центра, если это отверстия. Пошагово - это точка, лск, вставка фрагмента, совмещение его лск с созданной. И вот как определить, куда направлена нормаль, чтобы фрагмент оказался внутри тела, а не перевернут на 180 градусов?
[ Закрыто] Как узнать куда направлена нормаль - внутрь или наружу, Вопросы, возникающие при вставке 3D фрагмента
 
Всем добрый день. Решается задача программной вставки 3D фрагмента. Прогаммно делается так:
1. Строится точка, в которой будет вставлен 3D фрагмент (например, отверстие)
2. В этой точке создается ЛСК, к которой он будет привязан
3. Вставляется фрагмент
4. Привязывается к построенной ЛСК
5. Вычитается из тела.

При построении ЛСК используется нормаль поверхности, на которой будет располагаться фрагмент, и оси Z присваивается значение этой нормали. А теперь вопрос, как узнать, куда направлена эта нормаль, внутрь или наружу тела?
[ Закрыто] Как найти координаты узла в точке пересечения сплайна и прямой, определение координат точки пересечения сплайна и прямой
 
Спасибо за информацию. Я немного другим способом сделала:
Код
var topolRef = pickResult.SelectedObject as TopolReference;
            
            if (topolRef != null)
            {
                if (topolRef.IsKindOf(ObjectType.Face))
                {
                    var modelFace = topolRef.Topol as ModelFace;
                    if (modelFace != null)
                    {
                        if (modelFace.Surface is PlaneSurface)
                        {
                            var pSurf = modelFace.Surface as PlaneSurface;
                            var pt1 = pSurf.Plane.Origin;
                            var normal1 = pSurf.Plane.Normal;
                        }

                    }
                }
            }

Без этого if (topolRef.IsKindOf(ObjectType.Face)) все работает отлично, но при проверке, грань ли выбрана (т.к. есть еще возможность выбора ребра и там несколько другие параметры нужны), результат проверки - false.
Изменено: Batarejka - 17.07.2015 12:19:35
[ Закрыто] Как найти координаты узла в точке пересечения сплайна и прямой, определение координат точки пересечения сплайна и прямой
 
Игорь Батюченко,спасибо огромное!
[ Закрыто] Как найти координаты узла в точке пересечения сплайна и прямой, определение координат точки пересечения сплайна и прямой
 
Алексей, спасибо, в 14-ой версии заработало. Теперь новый квест.
Код
var filter = new SelectionFilter();
            filter.DisableAllTypes();
            filter.Enable(ObjectType.Face);
           
            var pickPointParameters = new PickPointParameters {Prompt = "Выберите КТЭ", Filter = filter };
            
            bool point = false;
            PickPointResult pickResult = null;

            while (!point)
            {
                pickResult = TFlex.Application.PickPoint(pickPointParameters);

                if (pickResult.SelectedObject != null)
                {
                    
                        point = true;
                    
                } 
            }

            MessageBox.Show(pickResult.SelectedObject.Name);

Собственно в pickResult у меня теперь хранится объект типа ModelObject. Это грань. Как мне получить геометрию этой грани? Нужны нормаль, точка на грани и тд.
[ Закрыто] Как найти координаты узла в точке пересечения сплайна и прямой, определение координат точки пересечения сплайна и прямой
 
Алексей,работаю в 12-ой версии
[ Закрыто] Как найти координаты узла в точке пересечения сплайна и прямой, определение координат точки пересечения сплайна и прямой
 
Алексей, спасибо. Но... или лыжи не едут, или ... Вот похожая проблема, так и оставшаяся без ответа http://tflex.ru/forum/index.php?PAGE_NAME=message&FID=14&TID=2046&TITLE_SEO=2046&MID=17920&tags=&q=S...
Хоть ты тресни, не получается в 3Д модели выбрать грань и продолжить с ней работу.
[ Закрыто] Как найти координаты узла в точке пересечения сплайна и прямой, определение координат точки пересечения сплайна и прямой
 
Цитата
drugg написал:
теперь у меня другая проблема: линию я рисую командой макроса, а сплайн у меня должен быть уже готовый, т.е. я должен как-то указать на него... а вот при помощи какого класса это можно сделать, пока не знаю. есть какой-то класс SelectionContainer, но он это или не он, не знаю, еще не пробовал...
кто-нибудь решал подобный вопрос? Т.е. у меня выполняется какая-то последовательность действий, потом нужно выбрать, к примеру, грань, и потом продолжить работу уже с выбранной гранью. Как реализовать ожидание выбора какого-либо объекта из кода?
Работа с ЛСК
 
Немножко стормозила. Теперь разобралась. Если кому пригодится


Код
var lcsname = ff.TargetLCS.Name;
 
Работа с ЛСК
 
Есть трехмерная сборка. Нужно получить доступ к ЛСК выбранного фрагмента.

ff - выбранный фрагмент



Код
            var lcsMove = new MoveRotateTransformation(DocComp);
            lcsMove.Offset_X = 300;
            lcsMove.Offset_Y = 300;
            lcsMove.Offset_Z = 300;

                       
            var lcss = DocComp.GetLCSs();
            
            
            foreach (var l in lcss)
            {
                if (l.Name == lcsname)
                {
                    var lcs = l;
                    lcs.VolatileTransformations.Add(lcsMove);
                }
            }
            
            lcs.VolatileTransformations.Add(lcsMove);

Проблема в поиске имени ЛСК lcsname, к которой привязан фрагмент. Или же эту ЛСК можно как-то получить непосредственно из фрагмента?
Выбор 3D фрагментов в сборке
 
Подскажите пожалуйста. Есть такая задача. Есть какая-то последовательность вычислений, которые выполняются в коде (плагин на шарпе), затем пользователю предлагается выбрать необходимый фрагмент в сборке, он его выбирает и затем плагин продолжает работу с выбранным фрагментом (перемещает, задает параметры). Как реализовать именно выбор фрагмента?
Шаблон CAD плагина для VS2008
 
У метода MainWindow ..::..InsertMenuPosition всего три значения

Member Value Description
EndOfTools - В конец меню Сервис
BeginOfTools - В начало меню Сервис
PluginSamples - В меню примеров приложений

Получается, что своего полноценного меню программно через плагин создать нельзя? Или я что-то пропустила?
Изменено: Batarejka - 23.11.2012 12:15:23
Страницы: 1 2 След.