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


Поиск  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Вопрос по API
 
Подскажите, пжалста, можно ли с помощью макроса программно вставить в сборку 3D-фрагмент из DOCs (важно!)? Почитал хэлп по API, нашел только методы, которые вставляют фрагменты по пути к файлу, т.е. фрагменты с диска.
Страницы: Пред. 1 2 3 4 5 6 7
Ответы
 
vite, спасибо за пример,

Однако чет у меня сомнения по поводу масштабируемости такого решения, так как массив "портится", и размножить его с "другими буквами" я уже не смогу. Тогда варианты:
1) писать какую-то "строку текста" в одном массиве, вычисляя попутно столбцы для каждого символа. Но такие вычисления делать мне не хочется.
2) создавать массив из API для каждого символа, копируя начальный квадратик. Это вариант попроще, мне так кажется.
Изменено: FRei - 06.10.2018 15:24:02
 
И все же как нужно обращаться к результату работы массива или операции копирования?
Код
      CoordinateNode3D node1 = new CoordinateNode3D(doc); 
       node1.X = 0; node1.Y = 0; node1.Z = 0;
      CoordinateNode3D node2 = new CoordinateNode3D(doc); 
       node2.X = -8.3; node2.Y = 0; node2.Z = 0;
      CoordinateNode3D node3 = new CoordinateNode3D(doc); 
       node3.X = 0; node3.Y = 8.3; node3.Z = 0;
      LinearArrayOperation lao = new LinearArrayOperation(doc, ArrayOperation.Type.Construction);
      CopyOperation2 copyprof= new CopyOperation2(doc, CopyBaseOperation2.Type.Construction);
      copyprof.Constructions.Add(prof);
      PointsLCS scs =  new PointsLCS(doc);
      PointsLCS tcs = new PointsLCS(doc);
      scs.PointToOrigin=node0.Geometry.Point;
      tcs.PointToOrigin=node1.Geometry.Point;
      copyprof.SourceLCS = scs;
      copyprof.TargetLCS = tcs;
      prof = copyprof as Profile; //здесь ошибка CS0039 Не удается преобразовать тип "TFlex.Model.Model3D.CopyOperation2" в "TFlex.Model.Model3D.Profile" путем преобразования ссылки, преобразования,  boxing-преобразования, unboxing-преобразования, преобразования перезаписи или преобразования типа со значением NULL
                lao.Constructions.Add(prof);
Как мне извлечь из copyprof мой профиль?
пока, выкрутился созданием нулевой копии и массивом от неё.
Как то так:
https://www.youtube.com/watch?v=jbJd6hVpTaE
Изменено: FRei - 07.10.2018 12:46:06
 
FRei, не знаю что вы хотите получить в конечном итоге. на мой взгляд, ваша модель получается слишком перегружена элементами построения. не проще использовать готовый фрагмент параметрического символа? к тому же, это даст существенный прирост производительности в процессе перестроения модели.
T-FLEX CAD 17.1.6.0
 
Цитата
vite написал:
FRei, не знаю что вы хотите получить в конечном итоге. на мой взгляд, ваша модель получается слишком перегружена элементами построения. не проще использовать готовый фрагмент параметрического символа? к тому же, это даст существенный прирост производительности в процессе перестроения модели.
матричный индикатор и хотел получить
модель может и перегружена, но мой уровень знаний API и C# не позволяет мне сделать проще.


Кстати, а как вывести что-нибудь в окошко выходные данные, для отладки?

Код
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using TFlex.Model;
using TFlex.Model.Model2D;
using TFlex.Model.Model3D;

namespace NewMacroNamespace
{
   public class Indicator
   {
static Dictionary<char, byte[,]> segments = new Dictionary<char, byte[,]>();
static CoordinateNode3D node0;
static PointsLCS scs;
   static Indicator()//конструктор
   {
segments.Add('А', new byte[,]{{0, 1, 1, 1, 0},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 1, 1, 1, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1}});
segments.Add('Б', new byte[,]{{1, 1, 1, 1, 1},{1, 0, 0, 0, 0},{1, 0, 0, 0, 0},{1, 1, 1, 1, 0},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 1, 1, 1, 0}});
segments.Add('В', new byte[,]{{1, 1, 1, 1, 0},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 1, 1, 1, 0},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 1, 1, 1, 0}});
segments.Add('Г', new byte[,]{{1, 1, 1, 1, 1},{1, 0, 0, 0, 0},{1, 0, 0, 0, 0},{1, 0, 0, 0, 0},{1, 0, 0, 0, 0},{1, 0, 0, 0, 0},{1, 0, 0, 0, 0}});
segments.Add('Д', new byte[,]{{0, 0, 0, 1, 1},{0, 0, 1, 0, 1},{0, 1, 0, 0, 1},{0, 1, 0, 0, 1},{0, 1, 0, 0, 1},{1, 1, 1, 1, 1},{1, 0, 0, 0, 1}});
segments.Add('Е', new byte[,]{{1, 1, 1, 1, 1},{1, 0, 0, 0, 0},{1, 0, 0, 0, 0},{1, 1, 1, 1, 0},{1, 0, 0, 0, 0},{1, 0, 0, 0, 0},{1, 1, 1, 1, 1}});
segments.Add('Ё', new byte[,]{{0, 1, 0, 1, 0},{1, 1, 1, 1, 1},{1, 0, 0, 0, 0},{1, 1, 1, 1, 1},{1, 0, 0, 0, 0},{1, 0, 0, 0, 0},{1, 1, 1, 1, 1}});
segments.Add('Ж', new byte[,]{{1, 0, 1, 0, 1},{1, 0, 1, 0, 1},{0, 1, 1, 1, 0},{0, 0, 1, 0, 0},{0, 1, 1, 1, 0},{1, 0, 1, 0, 1},{1, 0, 1, 0, 1}});
segments.Add('З', new byte[,]{{0, 1, 1, 1, 0},{1, 0, 0, 0, 1},{0, 0, 0, 0, 1},{0, 0, 1, 1, 0},{0, 0, 0, 0, 1},{1, 0, 0, 0, 1},{0, 1, 1, 1, 0}});
segments.Add('И', new byte[,]{{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 1, 1},{1, 0, 1, 0, 1},{1, 1, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1}});
segments.Add('Й', new byte[,]{{1, 0, 1, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 1, 1},{1, 0, 1, 0, 1},{1, 1, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1}});
segments.Add('К', new byte[,]{{1, 0, 0, 0, 1},{1, 0, 0, 1, 0},{1, 0, 1, 0, 0},{1, 1, 0, 0, 0},{1, 0, 1, 0, 0},{1, 0, 0, 1, 0},{1, 0, 0, 0, 1}});
segments.Add('Л', new byte[,]{{0, 0, 1, 1, 1},{0, 1, 0, 0, 1},{0, 1, 0, 0, 1},{0, 1, 0, 0, 1},{0, 1, 0, 0, 1},{0, 1, 0, 0, 1},{1, 1, 0, 0, 1}});
segments.Add('М', new byte[,]{{1, 0, 0, 0, 1},{1, 1, 0, 1, 1},{1, 0, 1, 0, 1},{1, 0, 1, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1}});
segments.Add('Н', new byte[,]{{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 1, 1, 1, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1}});
segments.Add('О', new byte[,]{{0, 1, 1, 1, 0},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{0, 1, 1, 1, 0}});
segments.Add('П', new byte[,]{{1, 1, 1, 1, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1}});
segments.Add('Р', new byte[,]{{1, 1, 1, 1, 0},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 1, 1, 1, 0},{1, 0, 0, 0, 0},{1, 0, 0, 0, 0},{1, 0, 0, 0, 0}});
segments.Add('С', new byte[,]{{0, 1, 1, 1, 0},{1, 0, 0, 0, 1},{1, 0, 0, 0, 0},{1, 0, 0, 0, 0},{1, 0, 0, 0, 0},{1, 0, 0, 0, 1},{0, 1, 1, 1, 0}});
segments.Add('Т', new byte[,]{{1, 1, 1, 1, 1},{0, 0, 1, 0, 0},{0, 0, 1, 0, 0},{0, 0, 1, 0, 0},{0, 0, 1, 0, 0},{0, 0, 1, 0, 0},{0, 0, 1, 0, 0}});
segments.Add('У', new byte[,]{{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{0, 1, 1, 1, 1},{0, 0, 0, 0, 1},{1, 0, 0, 0, 1},{0, 1, 1, 1, 0}});
segments.Add('Ф', new byte[,]{{0, 1, 1, 1, 0},{1, 0, 1, 0, 1},{1, 0, 1, 0, 1},{1, 0, 1, 0, 1},{0, 1, 1, 1, 0},{0, 0, 1, 0, 0},{0, 0, 1, 0, 0}});
segments.Add('Х', new byte[,]{{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{0, 1, 0, 1, 0},{0, 0, 1, 0, 0},{0, 1, 0, 1, 0},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1}});
segments.Add('Ц', new byte[,]{{1, 0, 0, 1, 0},{1, 0, 0, 1, 0},{1, 0, 0, 1, 0},{1, 0, 0, 1, 0},{1, 0, 0, 1, 0},{1, 1, 1, 1, 0},{0, 0, 0, 0, 1}});
segments.Add('Ч', new byte[,]{{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{0, 1, 1, 1, 1},{0, 0, 0, 0, 1},{0, 0, 0, 0, 1}});
segments.Add('Ш', new byte[,]{{1, 0, 1, 0, 1},{1, 0, 1, 0, 1},{1, 0, 1, 0, 1},{1, 0, 1, 0, 1},{1, 0, 1, 0, 1},{1, 0, 1, 0, 1},{1, 1, 1, 1, 1}});
segments.Add('Щ', new byte[,]{{1, 0, 1, 0, 1},{1, 0, 1, 0, 1},{1, 0, 1, 0, 1},{1, 0, 1, 0, 1},{1, 0, 1, 0, 1},{1, 1, 1, 1, 1},{0, 0, 0, 0, 1}});
segments.Add('Ъ', new byte[,]{{1, 1, 0, 0, 0},{0, 1, 0, 0, 0},{0, 1, 0, 0, 0},{0, 1, 1, 1, 0},{0, 1, 0, 0, 1},{0, 1, 0, 0, 1},{0, 1, 1, 1, 0}});
segments.Add('Ы', new byte[,]{{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 1, 0, 0, 1},{1, 0, 1, 0, 1},{1, 0, 1, 0, 1},{1, 1, 0, 0, 1}});
segments.Add('Ь', new byte[,]{{1, 0, 0, 0, 0},{1, 0, 0, 0, 0},{1, 0, 0, 0, 0},{1, 1, 1, 1, 0},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{1, 1, 1, 1, 0}});
segments.Add('Э', new byte[,]{{0, 1, 1, 1, 0},{1, 0, 0, 0, 1},{0, 0, 0, 0, 1},{0, 0, 1, 1, 1},{0, 0, 0, 0, 1},{1, 0, 0, 0, 1},{0, 1, 1, 1, 0}});
segments.Add('Ю', new byte[,]{{1, 0, 0, 1, 0},{1, 0, 1, 0, 1},{1, 0, 1, 0, 1},{1, 1, 1, 0, 1},{1, 0, 1, 0, 1},{1, 0, 1, 0, 1},{1, 0, 0, 1, 0}});
segments.Add('Я', new byte[,]{{0, 1, 1, 1, 1},{1, 0, 0, 0, 1},{1, 0, 0, 0, 1},{0, 1, 1, 1, 1},{0, 0, 1, 0, 1},{0, 1, 0, 0, 1},{1, 0, 0, 0, 1}});
Document doc = TFlex.Application.ActiveDocument;
doc.BeginChanges("ЛСК");        
CoordinateNode3D node0 = new CoordinateNode3D(doc); //3D Узел_1
node0.X = 0; node0.Y = 0; node0.Z = 0; node0.VisibleInScene= false;
PointsLCS scs =  new PointsLCS(doc);     //ЛСК_1
scs.PointToOrigin=node0.Geometry.Point; scs.VisibleInScene= false;
doc.EndChanges();   
   }
   public static void matrix(Profile prof, char val,int m, Document doc)
      {
      doc.BeginChanges("копия профиля");    
      CoordinateNode3D node1 = new CoordinateNode3D(doc); 
       node1.X = 0-m*8.3*6; node1.Y = 0; node1.Z = 0; node1.VisibleInScene= false;
      CoordinateNode3D node2 = new CoordinateNode3D(doc); 
       node2.X = -8.3-m*8.3*6; node2.Y = 0; node2.Z = 0; node2.VisibleInScene= false;
      CoordinateNode3D node3 = new CoordinateNode3D(doc); 
       node3.X = -m*8.3*6; node3.Y = 8.3; node3.Z = 0; node3.VisibleInScene= false;
      PointsLCS tcs = new PointsLCS(doc);
      tcs.PointToOrigin=node1.Geometry.Point;      tcs.VisibleInScene= false;            
      
      CopyOperation2 copyprof= new CopyOperation2(doc, CopyBaseOperation2.Type.Construction);
      copyprof.Constructions.Add(prof);
      copyprof.SourceLCS = (PointsLCS)doc.GetObjectByName("ЛСК_1");
      copyprof.TargetLCS = tcs;
      copyprof.VisibleInScene = false;
      doc.EndChanges();
        doc.BeginChanges("линейный массив");    
      LinearArrayOperation lao = new LinearArrayOperation(doc, ArrayOperation.Type.Operations);
      lao.Operations.Add(copyprof);
      lao.Direction1Point1 = node1.Geometry.Point;
      lao.Direction1Point2 = node2.Geometry.Point;
      lao.Direction1Number = 5;//кол-во копий
      lao.Direction1StepFromVector = true;//нарпавление
      lao.Direction1Step= 8;//шаг
      lao.Direction1Length = 16;//длина   
      lao.Direction2Point1 = node1.Geometry.Point;
      lao.Direction2Point2 = node3.Geometry.Point;
      lao.Direction2Number = 7;//кол-во копий
      lao.Direction2StepFromVector = true;//нарпавление
      lao.Direction2Step= 8;//шаг
      lao.Direction2Length = 16;//длина
      lao.IncludeBase=true; 
      lao.Exclusions.Clear();
for (int j=0;j<7;j++)
   for(int i=0;i<5;i++)
   if (segments[val][j,i]==0)   lao.Exclusions.Add(new Exclusion(lao, new Parameter(i), new Parameter(j)));
      
      doc.EndChanges();//Закрытие блока изменений документа
      }
   }//end class
   public class NewMacroClass
   {
      public static void NewMacro()
      {
      Document doc = TFlex.Application.ActiveDocument;
string word="ТФЛЕКС";//по дефолту
foreach(Variable v in doc.GetVariables())
    {
        if(v.Name == "$word")
        {
            word=v.TextValue;
         break;
        }
   }
char[] val=word.ToCharArray();      
      if (doc == null) return;
      foreach (ModelObject mo in doc.GetObjects())
            {
                if (mo.Name == "pixel")
                {
                    Profile pixel1 = mo as Profile;
                  for(int i = 0; i < word.Length; i++)
               {
               Indicator.matrix(pixel1,val[i],i,doc);
                    }
               break;
               }
             }
      doc.Redraw();   
      }
        

   }
}

Изменено: FRei - 08.10.2018 17:29:23
 
FRei, ну не скромничайте, ваш уровень достаточный. вы можете легко оптимизировать модель, чтобы избавиться от дубликатов массива. т.е. нужно просто создать универсальный фрагмент, который принимает параметры на вход: символ и смещение, относительно ЛСК. а вся логика перестроения символа может быть основана на матрице из БД. вместо дубликата массива, нужно вставить фрагмент в сборку и определить параметры. в данном случае, используется единственный экземпляр многократно вставленный в сборку с различными параметрами. в качестве теста, можно сравнить производительность на большом массиве данных, скажем из 1000 символов, интересно что получится.
T-FLEX CAD 17.1.6.0
 
Цитата
FRei написал:
Кстати, а как вывести что-нибудь в окошко выходные данные, для отладки?
я не пользуюсь отладчиком T-FLEX CAD, по-видимому метод TFlex.Log.Debug("")
T-FLEX CAD 17.1.6.0
 
И снова здравствуйте, пытаюсь соорудить макрос на вставку фрагмента в сборку.
Код
public static void NewMacro()
      {
   string pathFragment ="c:\\work\\T-Flex\\piece.grs";
   PointsLCS lcs;
   Document doc = TFlex.Application.ActiveDocument;
    doc.BeginChanges("");
   lcs = (PointsLCS)doc.GetObjectByName("start\back");
   Fragment3D fr = new Fragment3D(pathFragment, doc);
    fr.FixByFragmentLCS("head", lcs); 

    doc.EndChanges();//Закрытие блока изменений документа
      }
В сцене есть некий фрагмент с именем "start" я хочу привязаться к его СК с именем "back", но возникает ошибка GetObjectByName() возвращает Fragment3D и не удалось привести объект к типу PointsLCS. Как мне сделать ссылку на СК во фрагменте? В самом фрагменте СК сделал внешней. Вообще хочу сделать некую цепочку из одинаковых фрагментов, есть ли метод копирования в классе Fragment3D?
 
Цитата
FRei написал:
В сцене есть некий фрагмент с именем "start" я хочу привязаться к его СК с именем "back", но возникает ошибка GetObjectByName() возвращает Fragment3D и не удалось привести объект к типу PointsLCS. Как мне сделать ссылку на СК во фрагменте? В самом фрагменте СК сделал внешней. Вообще хочу сделать некую цепочку из одинаковых фрагментов, есть ли метод копирования в классе Fragment3D?
Разобрался с этим, фрагменты размножаются, теперь я хочу придать им степени свободы, но не понятно почему опция не включается:
Код
public static void NewMacro()      {
   string pathFragment ="c:\\work\\T-Flex\\piece.grs";
   PointsLCS lcs;
   Document doc = TFlex.Application.ActiveDocument;
    if (doc == null)
                return;
   doc.BeginChanges("");
for (int i =0; i<25; i++)
{   
   foreach (LCS target in doc.GetLCSs())
   {
      if (target.Name == "piece"+i+"\\back")
         {
            Fragment3D fr =    new Fragment3D(pathFragment, doc);
            fr.FixByFragmentLCS("head", target);
            fr.Name="piece"+(i+1);
            doc.ApplyChanges();
            fr.FreedomPropertyContainer.EnableRotationX = true;
            fr.FreedomPropertyContainer.EnableRotationY = true;
            fr.FreedomPropertyContainer.EnableRotationZ = true;
            fr.FreedomPropertyContainer.XRotation = true;
            fr.FreedomPropertyContainer.YRotation = true;
            fr.FreedomPropertyContainer.ZRotation = true;
            doc.ApplyChanges();
         }
   }
    }
doc.EndChanges();
   }
ЧЯДНТ?
Страницы: Пред. 1 2 3 4 5 6 7