Официальный форум российского программного комплекса 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 фрагмента
 
Ага, спасибо, туда я почему-то не долезла. Но, все равно остается открытым вопрос с этим кодом.[QUOTE]Vite написал:
//pointsLCS.DirectionToAxisX = /* Направление оси X (грань) */
           //pointsLCS.DirectionToAxisY = /* Направление оси Y (ребро) */[/QUOTE]
Собственно сами значения какие указывать? У меня по факту есть три выбранные грани PlaneSurface. Как инфу из них можно использовать для направления осей в нужную мне сторону.
[ Закрыто] Как узнать куда направлена нормаль - внутрь или наружу, Вопросы, возникающие при вставке 3D фрагмента
 
[QUOTE]Vite написал:
Вы создаете 3D узел по аналогии с операцией "По граням и смещениям", или что-то другое?[/QUOTE]
ммм, ну по факту так и получается, грань, накоторой эта точка будет и потом расстояния от других граней, все это потом через пересчет в ГСК и постановка точки в этих координатах. Просто расчеты не приводила тут, а сразу задание точки.
[ Закрыто] Как узнать куда направлена нормаль - внутрь или наружу, Вопросы, возникающие при вставке 3D фрагмента
 
Вот не обязательно вычитание. Отверстие - это как пример, а могут быть и более сложные элементы, а также не только вычитание, но и сложение.
[ Закрыто] Как узнать куда направлена нормаль - внутрь или наружу, Вопросы, возникающие при вставке 3D фрагмента
 
Собственно последовательность действий, я уже описала выше:

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

По факту задачу можно сформулировать так: Как программно построить ЛСК на плоскости, чтобы ось Z была перпендикулярна ей и направлена вне тела?
[CODE]//нормаль и точка на выбранной грани
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";

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

При построении ЛСК используется нормаль поверхности, на которой будет располагаться фрагмент, и оси Z присваивается значение этой нормали. А теперь вопрос, как узнать, куда направлена эта нормаль, внутрь или наружу тела?
[ Закрыто] Как найти координаты узла в точке пересечения сплайна и прямой, определение координат точки пересечения сплайна и прямой
 
Спасибо за информацию. Я немного другим способом сделала:
[CODE]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;
                       }

                   }
               }
           }
[/CODE]
Без этого  [COLOR=#000080]if (topolRef.IsKindOf(ObjectType.Face)) [/COLOR]все работает отлично, но при проверке, грань ли выбрана (т.к. есть еще возможность выбора ребра и там несколько другие параметры нужны), результат проверки - false.
Изменено: Batarejka - 17.07.2015 12:19:35
[ Закрыто] Как найти координаты узла в точке пересечения сплайна и прямой, определение координат точки пересечения сплайна и прямой
 
Игорь Батюченко,спасибо огромное!
[ Закрыто] Как найти координаты узла в точке пересечения сплайна и прямой, определение координат точки пересечения сплайна и прямой
 
Алексей, спасибо, в 14-ой версии заработало. Теперь новый квест.
           [CODE]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);

[/CODE]Собственно в pickResult у меня теперь хранится объект типа ModelObject. Это грань. Как мне получить геометрию этой грани? Нужны нормаль, точка на грани и тд.
[ Закрыто] Как найти координаты узла в точке пересечения сплайна и прямой, определение координат точки пересечения сплайна и прямой
 
Алексей,работаю в 12-ой версии
[ Закрыто] Как найти координаты узла в точке пересечения сплайна и прямой, определение координат точки пересечения сплайна и прямой
 
Алексей, спасибо. Но... или лыжи не едут, или ... Вот похожая проблема, так и оставшаяся без ответа [URL=http://tflex.ru/forum/index.php?PAGE_NAME=message&FID=14&TID=2046&TITLE_SEO=2046&MID=17920&tags=&q=Select&FORUM_ID%5B0%5D=14&DATE_CHANGE=0&order=relevance&s=%CD%E0%E9%F2%E8#message17920]http://tflex.ru/forum/index.php?PAGE_NAME=message&FID=14&TID=2046&TITLE_SEO=2046&MID=17920&tags=&q=S...[/URL]
Хоть ты тресни, не получается в 3Д модели выбрать грань и продолжить с ней работу.
[ Закрыто] Как найти координаты узла в точке пересечения сплайна и прямой, определение координат точки пересечения сплайна и прямой
 
[QUOTE]drugg написал:
теперь у меня другая проблема: линию я рисую командой макроса, а сплайн у меня должен быть уже готовый, т.е. я должен как-то указать на него... а вот при помощи какого класса это можно сделать, пока не знаю. есть какой-то класс SelectionContainer, но он это или не он, не знаю, еще не пробовал...[/QUOTE]
кто-нибудь решал подобный вопрос? Т.е. у меня выполняется какая-то последовательность действий, потом нужно выбрать, к примеру, грань, и потом продолжить работу уже с выбранной гранью. Как реализовать ожидание выбора какого-либо объекта из кода?
Работа с ЛСК
 
Немножко стормозила. Теперь разобралась. Если кому пригодится


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

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



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

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

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