Программирование в Сапфир

Здравствуйте уважаемые коллеги. Пытаюсь начать программировать в Сапфир. Начал знакомиться с доступными материалами. К своему неудовольствию обнаружил что api библиотеки написаны на С++. Но нашел скрипты написанные на java, вот этот например "c:\Users\Public\Documents\SAPFIR\SAPFIR 2016\Service\Test\Building.htm" исследовал код, но не смог найти библиотеку, импортированную в этот скрипт. Может кто то поможет?

У зв'язку з великою кількістю неіснуючих підписок на оновлення форуму була проведена очистка. Якщо ви перестали отримувати повідомлення з оновленнями, прохання провести підписку знову.
Сторінки: 1 2 Наст.
RSS
Программирование в Сапфир, Какие библиотеки за что отвечают
 
Здравствуйте уважаемые коллеги. Пытаюсь начать программировать в Сапфир. Начал знакомиться с доступными материалами. К своему неудовольствию обнаружил что api библиотеки написаны на С++. Но нашел скрипты написанные на java, вот этот например "c:\Users\Public\Documents\SAPFIR\SAPFIR 2016\Service\Test\Building.htm" исследовал код, но не смог найти библиотеку, импортированную в этот скрипт. Может кто то поможет?
 
В первую очередь интересует вопрос подключения к СОМ модели Сапфира. Я хочу знать возможно ли сделать это из IronPython?
 
Решение найдено

app = System.Runtime.InteropServices.Marshal.GetActiveObject("Sapfir.Application.6.0")
 
Цитата
Khasan Mamaev написав:
В первую очередь интересует вопрос подключения к СОМ модели Сапфира

Вместе с САПФИР, как правило, устанавливаются файлы документации (прилагается).
По Вашему вопросу см. раздел 10 (стр.127).
Также могут оказаться полезными файлы "Описание функций автоматизации САПФИР.pdf" и "Схема объектов автоматизации САПФИР.pdf".
Вы найдёте их в папке "Файлы документации САПФИР".
 
Цитата
Al2O3 написал:
Цитата
Khasan Mamaev  написав:
В первую очередь интересует вопрос подключения к СОМ модели Сапфира
Вместе с САПФИР, как правило, устанавливаются файлы документации (прилагается).
По Вашему вопросу см. раздел 10 (стр.127).
Также могут оказаться полезными файлы "Описание функций автоматизации САПФИР.pdf" и "Схема объектов автоматизации САПФИР.pdf".
Вы найдёте их в папке "Файлы документации САПФИР".
Спасибо Вам за ответ, но у меня есть эти материалы, может я плохо читаю или же действительно информации мало( Хотелось бы видеть практические примеры программ под Сапфир по построению новой модели, импорту и редактированию существующей модели. Собственно те самые примеры работы ради которых и стоит осваивать программирование под Сапфир. А то в документации все примеры про какое то занесение параметров.  
Змінено: Khasan Mamaev - 17.10.2016 17:26:55
 
Информации действительно маловато.

Пример практического построения новой модели приведен в файле C:\Users\Public\Documents\SAPFIR\SAPFIR 2016\Service\Users\TestStorey.htm
Этот файл содержит программу построения стен, перекрытия и крыши небольшого домика.

При этом используются вспомогательные функции, описанные в ServiceFun.jsh.

Чтобы исполнить программу, нужно сначала подключить её к САПФИР, как описано в разделе 10.1 "Учебного пособия",
с той разницей, что выбрать не DLL, а HTM файл и не нужно в аргументах задавать вызов StartFunction, просто оставить поле "Аргументы" пустым.
Команда появится в меню "Сервис". Если Вы работаете в интерфейсе стиля "лента", то включите также параллельно с лентой меню,
используя кнопку "Стиль" (галочку "Меню" включить).

В файле TestStorey.htm есть функция OnCreateWalls().
В ней последовательно происходит создание этажа, а затем создание ряда объектов типа "Стена".
Эти действия обрамляются специальными командами, обеспечивающими создание точек восстановления состояния модели по Undo,
что важно при редактировании.

Создание каждого объекта типа "Стена" выполняется при помощи специальной функции CreateWall(), которая находится в этом же файле.
Эта функция содержит вызов:
Код
var Wall = Storey.NewModel(TM_WALL);  // В текущем этаже создаем объект стена


Реализация этого вызова находится в ядре САПФИР. Там фабрика объектов порождает новый объект, тип которого наделён идентификатором TM_WALL.
Поведение и набор основных параметров этого объекта также определён внутри ядра САПФИР. Порождённый таким образом объект "Стена"
сразу оказывается включённым в информационную модель здания, составляющую суть документа САПФИР.
Соответственно он подхватывается конвейером визуализации, который обеспечивает отрисовку этого объекта в видах САПФИР.
Остаётся задать несколько параметров этого объекта, чтобы он был таким, как нам надо.
Для этого мы используем интерфейс  вида Wall.Parameter( <мнемоника параметра> ) = <значение>.

Можно наделять объекты и какими-то другими, дополнительными параметрами, кроме основных, влияние которых на поведение и внешний вид объекта заложено в ядро.
Эти параметры будут просто храниться в объекте до тех пор, пока к ним снова кто-то не обратится, чтобы реализовать свои прикладные задачи обработки информационной модели здания. Но это, как Вы верно заметили, выходит за рамки задачи создания и редактирования физической и аналитической составляющих информационной модели.

Кроме TM_WALL существует несколько других типов объектов. См. документ "Описание функций автоматизации САПФИР.pdf", стр. 4, 5.
 
Здравствуйте!

Создаю приложение на С++ используя ваш API, и пытаюсь получить данные об элементах модели созданной в САПФИР 2015 (Демо версия)
Нарисовал стену в Сапфире и попытался прочитать ее положение  в     пространстве (код ниже).
Кусок связанный с получением приложения, документа, проекта, этажа работает без вопросов, поэтому опускаю.
Методы GetPoints() и у AutoPolyLinу и AutoLine возвращают 0. В чем может быть проблема?

                     
Код
// поиск стены на этаже
long lType(10);  // MT_WALL
long lMdlT(0);
IAutoModelPtr pModel;
long lIndx(0);
do
{
   pModel = m_spfStorey->GetModelByIndex(lIndx);
   if(pModel)
      lMdlT = pModel->GetTypeModel();
   lIndx++;
}
while(lIndx < lMdlAll && lMdlT != lType);

if(lMdlT != lType)
   return E_UNEXPECTED;

// получаем осевую
IAutoPolyLinePtr pAxis = pModel->GetAxisLine();
if(pAxis)
{
   lMdlT = pAxis->GetTypeModel();   // здесь 4 - TM3_POLYLINE

   VARIANT vPoints;
   VariantInit(&vPoints);

   long lPnts = pAxis->GetPoints(&vPoints);    // здесь  0 ???

   long lLines = pAxis->GetCountLine();  //  здесь 1
   if(lLines > 0)
   {
      IAutoLinePtr pLine = pAxis->GetLine(0);
      if(pLine)
      {
         VARIANT vPoints;
         VariantInit(&vPoints);
         
         long lPnts = pLine->GetPoints(&vPoints);   // здесь  0 ???
      }
   }
}          
Змінено: Pavel Frantov - 27.10.2016 12:13:14
 
Если использовать библиотеку SpPlugin.dll то код программы определения точек стены может быть следующий
Код
void FindWall(void)
{
  // поиск стены на этаже 
  CSpStorey * pStorey = GetGlobalStorey();
  if (!pStorey)
    return; // нет текущего этажа

  long cnt = pStorey->GetCountModel(); // число моделей в этаже
  for (long i = 0; i < cnt; i++)
  {
    CSpObj pObj = pStorey->GetModelByIndex(i); // очередной объект
    long type = pObj.GetTypeModel(); // получить тип объекта
    if (type == TM_WALL)// 10 тип стены
    {
      CSpPolyLine PLine = pObj.GetAxisLine();  // Получаем у объекта стены осевую полилинию
      CP3Array pnts; // массив 3D точек
      PLine.GetPoints(pnts); // получаем точки полилинии
      long cnt_pt = pnts.GetCount(); // число точек
    }
  }
}
Змінено: vibo - 27.10.2016 12:28:03
 
Может быть я не уточнил, но речь идет о доступе к Сапфиру из сторонней программы, а не о написании плагина.
Делаю все тоже самое, но через COM - не выходит!
Пробовал создавать стену - также не получается задать положение ее осевой.
Вот решил попробовать получить данные готовой стены - и снова не выходит.

Для получения описания классов и методов C++ использую SAPFIR.tlb лежащую в папке
С:\Program Files (x86)\LIRA SAPR\LIRA SAPR 2015 DEMO\Sapfir 2015 (Study version)
 
1. SpPlugin.dll  можно подключить к другой программе и пользоваться тем сервисом что предоставляет SpPlugin.dll (массивы точек, матрицы, геометрические преобразования......)
2. Если использовать SAPFIR.tlb, то есть варианты.
2.1 если  .NET Framework то подключаете  SAPFIR.tlb в свойствах проекта как ссылку.
   
    Для доступа к точкам нужен массив SafeArray или JScriptArray, которые нужно подставить в VARIANT.  Такая реализация для работы с массивами вариантов нужна     для совместимости со скриптовыми языками (JScript, VBScript,...).
    Вот пример как это можно организовать:
Код
ref class CP3{
  public:
    double x, y, z;
  };

SapfirLib::AutoModel ^pObj = (SapfirLib::AutoModel ^)pSt->GetModelByIndex(i);
if (pObj)
{
  long type = pObj->TypeModel; // получить тип модели
  if (type==10) // Если стена TM_WALL
  {
    pModel->Select = 1; // выделим (подсветим) стену в САПФИРЕ
    SapfirLib::AutoPolyLine ^pLine = (SapfirLib::AutoPolyLine ^)pObj->GetAxisLine();
    if (pLine)
    {
      Object^ ObjPnt = gcnew array<Ob ject ^>(0); // Создаем пустой SafeArray массив(такая реализация для работы с массивами вариантов нужна для совместимости с скриптовыми языками)
      pLine->GetPoints(ObjPnt); // получаем массив точек, где Points[0]=x1,Points[1]=y1,Points[2]=z1,  Points[3]=x2,Points[4]=y2,Points[5]=z2,.....
      Array ^ArrPnt = (System::Array^)ObjPnt; // приводим к массиву
      long len = ArrPnt->Length; // количество координат в массиве
      long cnt = len / 3; // количество точек
      array<CP3 ^> ^ Points = gcnew array<CP3 ^>(cnt); // распределяем массив для точек
      for (long j = 0; j < cnt; j ++ )
      {
        CP3 ^pnt = gcnew CP3;
        pnt->x = (double)ArrPnt->GetValue(j*3);
        pnt->y = (double)ArrPnt->GetValue(j * 3 + 1);
        pnt->z = (double)ArrPnt->GetValue(j * 3 + 2);
        Points[j] = pnt; // заносим точку в массив
      }
    }
    break;
  }
}
2.2 Если через импорт библиотеки типов, то пример ниже
Код
#include <atlbase.h>
#include <atlsafe.h>
#import "...\sapfir.tlb" // auto_search auto_rename 

// константы см. const_model.jsh  
#define IMF_3D  0x001 // 3D модель
#define TM3_LINE    1  // тип сегмента: отрезок
#define TM3_ARC     2  // тип сегмента: дуга
#define TM3_BEZIER  3  // тип сегмента: Безье
#define TM_WALL    10    // тип объекта стена
#define UPDATE_MODELS 0x1000  // перерисовать модель документа
//.....
void OnTestSapfir()
{
  HRESULT hr = CoInitialize(NULL);
  using  namespace SapfirLib;
  IApplication *SapfirApp = NULL;
  CLSID ClassId;
  hr = CLSIDFromProgID(L"Sapfir.Application", &ClassId);
  if (FAILED(hr))
    return ;

  hr = CoCreateInstance(ClassId, NULL, CLSCTX_LOCAL_SERVER | CLSCTX_INPROC_SERVER, __uuidof(IApplication), reinterpret_cast<void**>(&SapfirApp));
  if (FAILED(hr))
    return;

  if (SapfirApp)
  {
    // в версиях 2016 и 2017 САПФИР запускается без окна
    SapfirApp->Visible = true;  // так можно показать окно САПФИРА
    ISapfirDocPtr pDоc = SapfirApp->GetActiveDoc(); // берем активный документ
    if (pDоc) // если документ есть
    {
      IAutoStoreyPtr pSt = pDоc->GetActiveStorey(); // берем активный этаж документа
      if (pSt) // если есть активный(текущий) этаж
      {
        long cnt = pSt->CountModel; // количество объектов на этаже
        for (long i = 0; i < cnt; i++)
        {
          IAutoModelPtr pMod = pSt->GetModelByIndex(i); // берем очередной объект
          if (pMod)
          {
            if (pMod->TypeModel == TM_WALL) // если это стена
            {
              IAutoPolyLinePtr pLn = pMod->GetAxisLine(); // берем полилинию контура
              if (pLn)
              {
                { //=================> Получение всех точек осевой стены
                  VARIANT  vPntArr;
                  //--> первый способ
                  SAFEARRAYBOUND sab;
                  sab.lLbound = 0; sab.cElements = 0;
                  vPntArr.parray = SafeArrayCreate(VT_VARIANT, 1, &sab);
                  //<--
                  //--> второй способ
//                  CComSafeArray<VARIANT> arr(1);
//                  vPntArr.parray = arr;
                  //<--
                  vPntArr.vt = VT_ARRAY | VT_VARIANT; //!!! Нужно объявить как массив вариантов. Так нужно для всех массивов.
                  pLn->GetPoints(&vPntArr); // получаем точки
                  
                  if (SAFEARRAY* saData = vPntArr.parray)
                  {
                    VARIANT HUGEP *pdFreq; 
                    HRESULT hr = SafeArrayAccessData(saData, (void HUGEP* FAR*)&pdFreq); // получаем указатель на массив вариантов
                    long num_coord = saData->cbElements;
                    double pnt;
                    for (long ic = 0; ic < num_coord; ic++)
                      pnt = pdFreq[ic].dblVal;
                  }
                }//<=====================

                { //=====================>  пройтись по сегментам полилинии
                  long cnt_l = pLn->GetCountLine(); // количество сегментов в полилинии 
                  for (long is = 0; is < cnt_l; is++)
                  {
                    IAutoLinePtr pSeg = pLn->GetLine(is);
                    if (pSeg)
                    {
                      long  typeSeg = pSeg->GetTypeModel();
                      if (typeSeg == TM3_LINE) // отрезок
                      {
                        CComSafeArray<VARIANT> arr(1);
                        VARIANT  vPntArr;
                        vPntArr.parray = arr;
                        vPntArr.vt = VT_ARRAY | VT_VARIANT; // массив вариантов
                        pSeg->GetPoints(&vPntArr); // получаем точки
                      }
                    }
                  }
                }//<=======================

                { //======================> заменим точки осевой линии стены
                  CComSafeArray<VARIANT> arr(6); 
                  double   arrCood[] = { 0.05, 0.1, 0.0, 3.45, 1.2, 0.0 }; // координаты в метрах
                  for (long ic = 0; ic < 6; ic++)
                    arr[ic] = arrCood[ic];
                  VARIANT  vPntArr;
                  vPntArr.vt = VT_ARRAY | VT_VARIANT; // массив вариантов
                  vPntArr.parray = arr;
                  pLn->SetPoints(vPntArr); // заносим новые точки (стена об этом ничего не знает!!!)

                  pMod->RegenModel(); // Заставим стену перестроить модель по новой осевой
                } //<=====================
              }
              pDоc->DrawModel(UPDATE_MODELS); // обновим и перерисуем модель модель документа
            }
          }
        }
      }
    }
  }
}
Змінено: vibo - 31.10.2016 10:27:38
 
Спасибо за пример!

Не хватало предварительной инициализации VARINT как массива перед вызовом GetPoints()
Код
VARIANT vPoints;
vPoints.vt = VT_ARRAY | VT_VARIANT; // так нужно для всех массивов
         
SAFEARRAYBOUND sab;
sab.lLbound = 0; sab.cElements = 0;
vPoints.parray = SafeArrayCreate(VT_VARIANT, 1, &sab);

long lPnts = pAxis->GetPoints(&vPoints);
Теперь все работает.
 
Пытаюсь что то делать в Сапфир из IronPython. Пытаюсь построить круглую колонну из примера, не получается, строит колонну квадратного сечения 3000х400х400, точки привязки работают, вот код:
Код
app = System.Runtime.InteropServices.Marshal.GetActiveObject("Sapfir.Application.5.0")

TM_OTHER = 128 # Иные Объекты
TM3_LINE = 1 # отрезок
TM_COLUMN = 12 # Колонна
TM3_ARC = 2# дуга
TMA_C_RAD_OR = 0x200
TM3_CIRC = TM3_ARC|TMA_C_RAD_OR
AppDoc = app.GetActiveDoc()
ActiveStorey = AppDoc.GetActiveStorey()
if not ActiveStorey:
   ActiveStorey = CreateStorey(0, 0)

def CreateColumn(Storey, R, elevation, pos_x, pos_y, pos_z):
   Column = Storey.NewModel(TM_COLUMN)
   param1 = "M_TOPLEVEL"
   #Column.Parameter(param1) = elevation # // возвышение отн.уровня: ноль этажа / высота этажа
   Column.SetPosition(pos_x, pos_y, pos_z)
   ParamObj = List[Object]()
   ParamObj.Add(0)
   ParamObj.Add(0)
   ParamObj.Add(0)
   ParamObj.Add(R)
   ParamObj.Add(0)
   Cont = Column.GetContour()# // Контейнер контуров
   PL = Cont.NewPolyLine()#        // Создадим полилинию внешнего контура
   PL.AddLine(TM3_CIRC, ParamObj)# // Добавляем окружность
   return Column

OUT = CreateColumn(ActiveStorey, 0.3, 0, 0, 0, 0)
Змінено: Khasan Mamaev - 11.11.2016 20:06:02
 
эту строку закомментил, потому что Питон ругается "Предупреждение:IronPythonEvaluator.EvaluateIronPythonScript операция не выполнена.
 File "", line 27
    Column.Parameter(param1) = elevation # // возвышение отн.уровня: ноль этажа / высота этажа

    ^
SyntaxError: can't assign to function call"
Код
param1 = "M_TOPLEVEL"
#Column.Parameter(param1) = elevation # // возвышение отн.уровня: ноль этажа / высота этажа
Змінено: Khasan Mamaev - 11.11.2016 20:08:00
 
Пример создания колонны на IronPython
Код
import System
from System import Array

App = System.Runtime.InteropServices.Marshal.GetActiveObject("Sapfir.Application") #// получаем приложение Сапфир (текущей установленной версии)

TM_OTHER = 128 
TM3_LINE = 1 
TM_COLUMN = 12 
TM3_ARC = 2
TMA_C_RAD_OR = 0x200
TM3_CIRC = TM3_ARC|TMA_C_RAD_OR

AppDoc = App.GetActiveDoc()                  #// получаем текущий документ
ActiveStorey = AppDoc.GetActiveStorey()      #// получаем текущий этаж
if not ActiveStorey:
   ActiveStorey = CreateStorey(0, 0)

def CreateColumn(Storey, R, elevation, pos_x, pos_y, pos_z):
   Column = Storey.NewModel(TM_COLUMN)        #// создаем колонну на этаже
   Column.SetPosition(pos_x, pos_y, pos_z)    #// позиция колонны в системе координат этажа
   Column.Parameter['M_TOPLEVEL']=elevation;  #// устанавливаем параметр 
   MC=Column.GetMultiContour()                #// У объектов балка и колонна получаем объект сечение. Он хранит готовые контуры, и может генерить параметрические контуры
   Cont = MC.GetContour()                     #// У объекта сечение получаем массив контуров                    
   PL = Cont.NewPolyLine()                    #// создаем в контуре новую полилинию
   Param = Array[object]([0,0,0,R,0])         #// !!! все массивы должны быть 'object'
   PL.AddLine(TM3_CIRC, Param)                #// добавляем в полилинию сегмент 'окружность' с параметрами: центр, радиус, ориентация(0-против частовой стрелки, 1-по)
   return Column

OUT = CreateColumn(ActiveStorey, 0.3, 0.5, 0, 0, 0)
 
Гениально!) Спасибо большое, получилось
 
использую net Framework C#
Подключил SAPFIR.tlb как ссылку
Как обратиться дальше к документу этажу и далее
Спасибо
 
Цитата
dev_sapfir написал:
использую net Framework C#
Подключил SAPFIR.tlb как ссылку
Как обратиться дальше к документу этажу и далее
Спасибо
мне кажется на СиШарпе не получится, нужен Си++
 
В руководстве написано что можно и на NetFramework. А там вроде без разницы язык. Даже на F# можно. Хотя могу ошибаться.

Второй вопрос - правильно ли я оцениваю перспективы. Сапфир будет развиваться в сторону увеличения архитектурной составляющей?

Т.е. в перспективе 5-10 лет архитекторы смогут вычерчивать свои чертежи?
Т.е. через 5 лет Сапфир + Лира >= Revit + Robot?
 
Пример кода на C#
Код
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;

namespace WindowsFormsApplication1
{
  static class DrawMode
  {
    public const int UPDATE_MODELS  = 0x1000;   // обновить (обновить неактуальные модели) модель, структуру модели, и перерисовать все
    public const int ZOOM_ALL = 0x2000;         // показать все
    public const int VIEW_PR_PARALLEL = 0x4000; // Установить параллельный аппарат проецирования
    public const int VIEW_PR_PERSPECTIVE = 0x8000; // Установить перспективный аппарат проецирования
    public const int VIEW_PR_UPDATE_SELECT = 0x10000; // Отработать изменение состава выделенных объектов
    public const int UPDATE_TREE_VIEW = 0x20000; // Отработать изменение в дилоге структура проекта
  }

  static class TM //некторые типы объектов САПФИР (более полно см.SpTypeModel.h из комплекта SDK)
  {
    public const int PROJECT = 3;  // Здание (проект)      
    public const int STOREY = 4;   // Этаж                 
    public const int WALL = 10;    // Стена
    public const int SLAB = 11;  // Перекрытие           
    public const int COLUMN = 12;  // Колонна              
    public const int BEAM = 13;  // Балка                
    public const int ROOF = 15;  // Крыша                
    public const int STAIRS = 16;  // Лестница             
    public const int AXES = 17;  // Оси координационные  
    public const int LINE = 18;  // Линия (построения)   
                                              
    public const int HOLE = 30;  // Проем                    
    public const int WINDOW = 31;  // Окно                     
    public const int DOOR = 32;  // Дверь                
  }

  public partial class Form1 : Form
  {
    public SapfirLib.IApplication m_pSapApp;
    public string NameApp = "FormSapfir.exe"; // название приложения (любое)

    public Form1()
    {
      InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
      if (m_pSapApp==null) // если еще нет сапфира
        m_pSapApp = new SapfirLib.Application();// запускаем сапфир
      m_pSapApp.AfxMessage("Привет",1);
    }

    private void button1_Click(object sender, EventArgs e)
    {
      if (m_pSapApp == null) // если еще нет сапфира
      {
//        Process[] proc = System.Diagnostics.Process.GetProcessesByName("Sapfir");
        m_pSapApp = new SapfirLib.Application(); // запускаем сапфир
 
      }
      m_pSapApp.SetLockedApp(NameApp);     // блокируем SAPFIR именем текущего приложением
      m_pSapApp.Visible = 1;               // показываем окно сапфира
      SapfirLib.ISapfirDoc SapfirDoc = m_pSapApp.GetActiveDoc();     // получаем активный документ

//      SapfirLib.IAutoStorey Storey = SapfirDoc.GetActiveStorey(); // получаем активный этаж документа
      int numPr = SapfirDoc.CountProjects; // получем количество проектов(зданий) в документе
      SapfirLib.IAutoProject Project = null; // ссылка на проект (здание)
      if(numPr==0)
        Project = SapfirDoc.NewProject(); // создаем новое здание
      else
      {
//        Project = SapfirDoc.GetActiveProject(); // получаем текущее здание
        Project = SapfirDoc.GetProjectByIndex(0); // получаем первое по счету здание
      }
      if(Project!=null) // если здание есть
      {
        SapfirLib.IAutoStorey Storey = null;  // ссылка на этаж
        int numSt = Project.CountStorey;       //получаем количество этажей в здании
        if (numSt == 0)
          Storey = Project.NewStorey("Первый этаж");
        else
        {
//          Storey = Project.GetFirstStorey(1); // получаем самый нижний этаж
//          Storey = Project.GetStoreyByIndex(0); // получаем первый по счету этаж
          Storey = Project.GetFirstStorey(1); // получаем самый нижний этаж
        }
        if(Storey!=null)
        {
          SapfirLib.IAutoModel Wall = Storey.NewModel(TM.WALL);
          if (Wall != null)
          {
            SapfirLib.IAutoPolyLine Line = Wall.GetAxisLine(); // получили осевую линию стены
//       var Pnt = new object[9]; // объявляем массив точек (такой массив используется и для других данных, например, массив параметров)
//       double[] pnt = { 0, 0, 0, 4, 0, 0, 4, 3, 0 }; // координаты точек осевой линии стены {x1,y1,z1, x2,y2,z2, x3,y3,z3...}
//       for (int i = 0; i < 9; i++)
//         Pnt[i] = pnt[i];   // заносим координаты точек в массив
            var Pnt = new Object[] { 0.0, 0.0, 0.0, 4.0, 0.0, 0.0, 4.0, 3.0, 0.0 }; // объявляем массив точек
            Line.SetPoints(Pnt); // занесли точки в линию
            Wall.set_Parameter("M_THICKNESS", 0.25); // Толщина стены [м] (имена параметров можно посмотреть в окне свойств объекта ,если включить опцию "Настройки сапфир\редактирование\таблица параметров\показ мнемоник", или см. документацию )
            SapfirDoc.DrawModel(DrawMode.UPDATE_MODELS|DrawMode.UPDATE_TREE_VIEW); // перерисовываем модель
          }
        }
      }
    }
  }
}
Змінено: vibo - 28.02.2017 11:52:37
 
Спасибо vibo. Есть от чего отталкиваться.  
Сторінки: 1 2 Наст.
Читають тему (гостей: 1)