vibo (Всі повідомлення користувача)

Форум пользователей программных комплексов ЛИРА-САПР, МОНОМАХ-САПР, САПФИР-3D, ЭСПРИ

У зв'язку з великою кількістю неіснуючих підписок на оновлення форуму була проведена очистка. Якщо ви перестали отримувати повідомлення з оновленнями, прохання провести підписку знову.
Вибрати дату в календаріВибрати дату в календарі

Сторінки: Поперед. 1 2
Работа с нодами, Обсуждение проблем и решений при использовании нодов
 
4) сохранив модель, с настроенными параметрами нода стен, по толщине, аналитические стены по перекрытиям, при переносе файла на другое рабочее место, подключении того же самого файла подложки, эти параметры (и вероятно не только описанные) слетают видимо на предустановленные...

Параметры стен, колонн,... необходимо задавать только в свойствах нодов. Тогда при переносе на другой комп. все параметры сохранятся (во всяком случае должны).
Если параметры устанавливать самим стенам и колоннам, созданным по подложке, и если при обновлении модели файла подложки не будет, то стены и др. удалятся
После задания нового пути к файлу подложки, объекты будут создаваться, но с параметрами заданными в образцовых объектах нодов.
Работа с нодами, Обсуждение проблем и решений при использовании нодов
 
2) С колоннами вообще черти что происходит. .....

Для правильной работы с подложками необходимо чтобы все линии и  точки были заданы на уровне Z = 0.
В свойствах нодов колонн,балок,стен,... задавать свойство тиражировать по этажам и  задать те этажи,
на которых должны формироваться соответствующие объекты.

В вашем случае колонны создаются по контурам, расположенным на отметке -14м. В текущей версии нодов, этот уровень используется в качестве уровня колонны в этаже. Если в свойствах нода задать уровень 0 то он устанавливается только для образцовой модели нода, а при генерации реальных колонн используется уровень исходных линий. Если параметры образцового объекта отличаются от параметров реальных объектов то в качестве значения пишется <?>. В следующем релизе мы постараемся решить проблему.
Работа с нодами, Обсуждение проблем и решений при использовании нодов
 
Проблемы:
1) Балки не создаются на втором этаже, не понятно почему. Заказано расположение только на выбранных этажах.

Исходные линии для балок (да и вся полдожка) находится на уровне -14м. Уровень второго этажа 0м.
В свойствах нода задано "не тиражировать", и создавать на "заданном" втором этаже.
При таких параметрах нода, балки будут создаваться на данном этаже только если уровень задающих линий будет в пределах этажа.

Необходимо  включить режим "тиражирование",  при этом уровень исходных линий не проверяется, и балки будут создаваться на всех "заданных этажах", в вашем случае только на втором.
Работа с нодами, Обсуждение проблем и решений при использовании нодов
 
Пришлите файл spf. Посмотрим в чем проблемы.
Программирование в Сапфир, Какие библиотеки за что отвечают
 
В текущих версиях доступа к загружениям из API нет. Доработка планируется.
Программирование в Сапфир, Какие библиотеки за что отвечают
 
Цитата
а как из этой линии получить список точек например?

В посте №10 есть пример кода как в цикле перебирать все объекты этажа и как получать точки из полилинии
На C# точки полилинии можно получить вот так:
Код
SapfirLib.IAutoPolyLine Line = Model.GetAxisLine();   // получить осевую линию (стены, плиты, балки ...)
object PntOut = new object[] { 1.0 };  // массив SAFEARRAY предварительно нужно инстанциировать
Line.GetPoints(ref PntOut);            // получаем точки полилинии
var pt = (object[])PntOut;
int cnt = pt.Length;
for (int i = 0; i < cnt; i+=3)
{
   double px = (double)pt[i];
   double py = (double)pt[i + 1];
   double pz = (double)pt[i + 2];
}
Змінено: vibo - 06.03.2017 13:59:19
Программирование в Сапфир, Какие библиотеки за что отвечают
 
Цитата
Где найти список всех параметров?
В папке "C:\Program Files (x86)\SAPFIR\Sapfir 2016\Manual" есть два документа:
"Схема объектов автоматизации САПФИР.pdf" и "Описание функций автоматизации САПФИР.pdf". Рекомендую ознакомиться.
Программирование в Сапфир, Какие библиотеки за что отвечают
 
Пример создания нагрузок на C#
       
Код
          int LOAD = 21;                 // Нагрузка сила
          int LOAD_POINT = LOAD+0x10000; // точечная нагрузка
          int LOAD_LINE = LOAD+0x20000;  // линейная нагрузка
          int LOAD_AREA = LOAD+0x40000;  // площадная нагрузка

          SapfirLib.IAutoModel Load1 = Storey.NewModel(LOAD_POINT); // Создаем нагрузку точечную
          if (Load1 != null)
          {
            Load1.SetPosition(1.0, 0.0, 0.0);               // позиция
            Load1.set_Parameter("M_LOAD_1", 0.65);          // величина тс
          }

          SapfirLib.IAutoModel Load2 = Storey.NewModel(LOAD_LINE); // Создаем нагрузку линейную
          if (Load2 != null)
          {
            SapfirLib.IAutoPolyLine Line = Load2.GetAxisLine();   // получить осевую линию нагрузки
            var Pnt = new Object[] { 0.0, 1.0, 0.0, 0.0, 2.0, 0.0, 0.5, 4.0, 0.0 }; // объявляем массив точек
            Line.SetPoints(Pnt);                                // занесли точки в линию
            Load2.set_Parameter("M_LOAD_1", 0.35);              // величина тс
            Load2.set_Parameter("M_LOAD_2", 0.35);              // величина тс
            Load2.SetPosition(0.0, 1.5, 0.0);                   // позиция текста
          }

          SapfirLib.IAutoModel Load3 = Storey.NewModel(LOAD_AREA); // Создаем нагрузку площадную
          if (Load3 != null)
          {
            SapfirLib.IAutoPolyLine Line = Load3.GetAxisLine();   // получить осевую линию нагрузки
            var Pnt = new Object[] { 2.0, 1.0, 0.0, 4.0, 1.0, 0.0, 4.0, 3.0, 0.0, 2.0, 4.0, 0.0, 2.0, 1.0, 0.0 }; // объявляем массив точек
            Line.SetPoints(Pnt);                                // занесли точки в линию
            Load3.set_Parameter("M_LOAD_1", 0.44);              // величина тс
            Load3.set_Parameter("M_LOAD_2", 0.44);              // величина тс
            Load3.SetPosition(3.0, 2.0, 0.0);                   // позиция текста
          }
Программирование в Сапфир, Какие библиотеки за что отвечают
 
Пример кода на 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
Подрезка по наклонной плоскости
 
Плоскость подрезки (штриховку) лучше задавать по трем точкам.
Получается треугольник как показано на рис. 1.
Выполнить подрезку стены.
Затем выделить штриховку и переключиться в режим аналитики. рис.2
Перенести вершины контура штриховки на вершины контура аналитической пластины лестницы

 
Подрезка по наклонной плоскости
 
http://www.liraland.ua/video/example/otsechenie_3d.html
Кроме подрезок, в Вашем случае можно воспользоваться отверстием в стене.
Змінено: vibo - 25.02.2017 18:48:17
Программирование в Сапфир, Какие библиотеки за что отвечают
 
Пример создания колонны на 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)
Программирование в Сапфир, Какие библиотеки за что отвечают
 
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
Программирование в Сапфир, Какие библиотеки за что отвечают
 
Если использовать библиотеку 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
Сапфир построение
 
Цитата
Oleg Kostyk пишет:
Еще вопрос "Для видов документирования, помещенных на чертеж, добавлена возможность «рассыпать» на элементарные примитивы, с возможностью дальнейшего редактирования на чертеже."-где эта кнопка? спасибо.
Необходимо на листе чертежа указать мышкой (выделить) чертеж вида документирования и нажать кнопку "Разобрать блок(и)" см. рис. Кнопка будет доступна для чертежей армирования и планов, если на них есть только стены, колонны, перекрытия, балки, размеры, лестницы и линии. Если есть 3D объекты типа  призма, конус и прочее, то кнопка не будет активна.
HELP! PLEASE!!, диплом
 
1. в архитектуре рекомендуется выполнить диагностику через меню "Сервисы/Диагностика объекта". В окне служебная информация появится список плохих объектов и несколько плит над колоннами второго этажа, которые находятся внутри перекрытия. Указывая курсором  строки сообщения, через через контекстное меню удалить эти объекты.
2. в конструировании заново сформировать расчетную схему.
3. ОБЯЗАТЕЛЬНО! выполнить пересечение стержней и пластин
4. и только теперь триангулировать  
Сторінки: Поперед. 1 2