Перейти к содержанию

Блоги

Блоги нашего сообщества

  1. Две небольшие утилиты с простейшим алгоритмом выполнения позволят вам восстановить из примитивов чертежа полноценные объекты nanoCAD СПДС и комфортно продолжить работу.

     

    Разбитые на примитивы dwg таблицы – нередкое явление в чертежах. Работать с ними можно, но весьма неудобно. Добавить строки и столбцы в такие таблицы просто, а вот вставить новые – трудоемко.
    nanoCAD Plus с модулем СПДС позволяет «склеить» отрезки и текст (примитивы чертежа) в таблицы nanoCAD. Для этого разработана утилита Распознавание таблиц.
    Команду Распознавание таблиц (SPRECTABLE, RECTABLE) вы найдете в ленточном интерфейсе на вкладке СПДС, в подвале группы Форматы, таблицы Читать дальше т 

  2. <Каталог>
     

    Bentley.
    Bentley Product Documentation - https://docs.bentley.com/LiveContent/index.html

     

    MDE Database.

    Connecting to MS Access Database from MicroStation Connect
    https://communities.bentley.com/products/microstation/w/microstation__wiki/46186/connecting-to-ms-access-database-from-microstation-connect
    Microsoft Access WiKi - https://en.wikipedia.org/wiki/Microsoft_Access
    Import Access 2.0 and Access 95 databases into current versions - 
    https://support.microsoft.com/en-us/office/import-access-2-0-and-access-95-databases-into-current-versions-2e9d8851-101d-4407-a881-65d06bb12aa7
    Converting a Microsoft Access Database to an MDE File - 
    http://www.databasedev.co.uk/microsoft-access-mde.html
    --------------------------------------------------

     

    TerraSolid.

    Статьи:

    https://lidar.asia/tag/terrascan/

    2016-03-14 Terrasolid TerraScan. Часть первая. Версии.
    https://lidar.asia/laserscanning/terrasolid-terrascan-chast-pervaya/

    Spatix User Guide, ver 17.04.2020
    http://www.terrasolid.com/guides/spatix/index.html
    2016-06-24 Which file formats are recommended for processing point clouds in TerraScan?
    https://support.geocue.com/file-formats-recommended-processing-point-clouds-terrascan/
    2016-11-09 TerraScan Trajectories
    https://support.geocue.com/terrascan-trajectories/

    2019-02-20 TerraScan Supported Point File Formats
    https://support.geocue.com/terrascan-supported-point-file-formats/

    --------------------------------------------------
     

    ГИСвер Интегро.

    https://gisw.ru/ru/spatix
    Программные продукты компании TerraSolid

    https://gisw.ru/ru/distribution/Terrasolid

    --------------------------------------------------

    Статьи:

    2016-09-08 Программирование. Этот заковыристый TIN.

    https://lidar.asia/laserscanning/programmirovanie-etot-zakovyristyj-tin/

    2017 Программы для обработки данных лазерного сканирования местности + перечень используемой литературы

    САПР и ГИС автомобильных дорог, 2017 № 2(9)
    http://www.cadgis.ru/2017/9/02

    2018-01-17 Microstation VBA и TarraScan
    https://lidar.asia/laserscanning/microstation-vba-i-terrascan/

    Visual Studio и Microstation Development

    http://www.la-solutions.co.uk/content/CONNECT/MicroStationAPI/VizStudio.htm

     

    Видео:

    YouDays - https://www.youtube.com/channel/UC2bTDCZ3k_qH1dgknP3Ms9A
    Юля инженер - https://www.youtube.com/channel/UC-znzl77pjQ0imwTDqu0Fxg

     

    Sample LAS Data:

    www.esna.edu - https://www.usna.edu/Users/oceano/pguth/md_help/rabat_courses/geology_lidar_sampler_lab.html

     

  3. Часто возникает вопрос со стороны пользователей: Почему из ARCHICAD не приходят помещения? И чаще всего архитекторы забывают отображать помещения в 3D модели при сохранении IFC. Ниже укрупненные шаги, как все-таки подготовить корректные IFC из ARCHICAD. Хотя в общем виде схема универсальна для любых других архитектурных BIM-систем. Итак...

     

    Со стороны ARCHICAD процесс достаточно простой:

    1. Замоделировать модель с проработкой помещений (помещения = Зоны, какие параметры задаются для помещений, такие и сохранятся потом в IFC).

    2. Перейти в 3D пространство с отображением зон. Можно отображать поэтажно, можно всю модель - тут как удобнее вам. Если архитектор не знает как в 3D отобразить зоны, то это документация. Либо вот скриншот:

    image.png

     

    3. Сохранить как IFC из 3D окна. В простейшем случае сделать просто Файл\Сохранить как..., выбрать формат IFC и настроить два параметра - Сохранять то, что отображается в 3D + Сохранять через транслятор "Точный экспорт геометрии":

    image.png

     

    В более сложных случаях там можно десятки параметров настроить: полноту передачи информационных данных, формат IFC, папка сохранения. В идеале можно настроить так, что из ARCHICAD будет сохранять в один клик не только один IFC, а куча данных - DWG, Excel таблицы, PDF, IFC по этажам, BIMx модель и т.д. - функция называется Публикатор. Но тут точно надо читать документацию и думать, что хочешь получить - в рамках краткого ответа на форуме тут не описать все возможности.

  4. Небольшая статейка о том, как сделать, чтобы при отзеркаливание параметрического объекта СПДС не зеркалился текст прописаный в геометрии объекта (UText)
    Ответ прост - никак :D

    Даже если вы создадите для объекта вид сзади, который будет зеркален виду спереди, текст в геометрии себя будет вести неадекватно

    Спойлер

    MTEvOQA2R8.gif.68f408b1dec328edf836e0ec9e5b7957.gif.a4092fee4615478628e2fdad6887cc4f.gif

     

    Тогда что же делать?
    Во-первых, мы не будем создавать вид сзади. Мы заставим объект отзеркалиться обратно!
    Что нам для этого надо:
    1. Заставить объект понимать, что он отзеркален.
    2. Заставить объект, если он отзеркален, зеркалить себя обратно.

    3. Заставить объект переместить себя на нужное место.
     

    Решаем первую задачу

    Мой объект -  Пример для отзеркаливания текста (пустышка).mcd

    Вводим две переменные в объект:
    rAngleX (назовём её "Угол X") и rAngleY (назовём её "Угол Y")

    для переменной "Угол X" вычисляем угол между глобальной осью oY и вектором нашего объекта vecDirection

    rAngleX = angleTwoPi(oY,vecDirection);

    Для "Угол Y" вычисляем угол между осью oY и вектором нашего объекта vecPlane

    rAngleY = angleTwoPi(oY,vecPlane);

     

    Создаём функцию MirrorObject вначале нашего кода и прописываем там наши формулы

     

    function MirrorObject
    {
    	rAngleX = angleTwoPi(oY,vecDirection);
    	rAngleY = angleTwoPi(oY,vecPlane);
    }

     

    Прописываем нашу функцию в функциях OnInitialization, чтобы инициализировать  при вставке объекта наши переменные, и в OnMakeParameters, что при обновление объекта с помощью команды SPREGENSTD наши параметры обновились (на видео я запускаю эту команду через кнопку)
     

    Спойлер

     

    Из видео видно, что если мы зеркалим объект по оси Y то
    Угол X = 90

    Угол Y = 0

     

    А если по X, то

    Угол X = 270

    Угол Y = 180

     

    С первой задачей мы справились, наш объект понимает, что он отзеркален. Переходим ко второму пункту.

     

    Тут всё просто, на самом деле)

    Прописываем iff'ы, которые при определённых значения rAngleX и rAngleY будут разворачивать наш объект

    И загоняем их в нашу функцию  MirrorObject

    Рассмотрим момент, когда мы зеркалим по оси Y.

    Что происходит в этот  момент с объектом?
    У него меняется направления вектора vecDirection. Значит, чтобы отзеркалить объект обратно, нам надо для начала поменять направления вектора vecDirection!
    пишем:

    if(rAngleX==90 && rAngleY==0)
    {
    	vecDirection = -vecDirection;
    }

    А при зеркале по оси X меняется направление vecPlane, как следствие:

     

    if(rAngleX==270 && rAngleY==180)
    {
    	vecPlane= -vecPlane;
    }

     

    Загоняем это в нашу функцию

    function MirrorObject
    {
    	rAngleX = angleTwoPi(oY,vecDirection);
    	rAngleY = angleTwoPi(oY,vecPlane);
    	if(rAngleX==90 && rAngleY==0)
    	{
    		vecDirection = -vecDirection;
    	}
    	if(rAngleX==270 && rAngleY==180)
    	{
    		vecPlane= -vecPlane;
    	}
    }

    Сохраняем объект и обновляем его на чертеже
     

    Спойлер

     

    О чудо, всё заработало!)

    Но ещё рано радоваться, проверяем разные случаи и получаем:

    Спойлер

     

    Логика та же, что и раньше, дописываем iff'ы исходя из угла)

     

    function MirrorObject
    {
    	rAngleY = angleTwoPi(oY,vecPlane);
    	rAngleX = angleTwoPi(oY,vecDirection);
    	if(rAngleX==90 && rAngleY==0)
    	{
    		vecDirection=-vecDirection;
    	}
    	if(rAngleX==270 && rAngleY==180)
    	{
    		vecPlane=-vecPlane;
    	}
    	if(rAngleX==0 && rAngleY==270)
    	{
    		vecDirection=-vecDirection;
    	}
    	if(rAngleX==180 && rAngleY==90)
    	{
    		vecPlane=-vecPlane;
    	}
    }

    Запись специально не упрощал, но вы можете, если хотите,  объединить через "или" (||) часть кода)

    Проверяем результат:

    Спойлер


    Текст не зеркалится, но крутится.

    Чтобы решить эту проблему, надо ввести переменную, отвечающую за поворот текста.

    В ActHeader в Public дописываем переменную 

    sTextAngle, "hidden" 

    я её скрыл, потому что вручную менять не планирую, если хотите, можете оставить открытой.

    А коде исполнения UText дополняем переменной нашего угла:
     

    UText(mp, DegToRad(sTextAngle), 2.5*rSymScl/rScl, 0, 0.0000, T, 1,1);

    Я буду работать с углом в градусах

     

    Далее мы определяем в каких значения Угла X и Угла Y у нас текст повёрнут и выставляем для этого случая нужное нам значение sTextAngle, тем самым формирую итоговый вид нашей функции:
     

    function MirrorObject
    {
    	rAngleY = angleTwoPi(oY,vecPlane);
    	rAngleX = angleTwoPi(oY,vecDirection);
    	if(rAngleX==90 && rAngleY==0)
    	{
    		vecDirection=-vecDirection;
    	}
    	if(rAngleX==270 && rAngleY==180)
    	{
    		vecPlane=-vecPlane;
    	}
    	if(rAngleX==0 && rAngleY==270)
    	{
    		vecDirection=-vecDirection;
    	}
    	if(rAngleX==180 && rAngleY==90)
    	{
    		vecPlane=-vecPlane;
    	}
    	
    	if(rAngleY==180 || rAngleY==270)
    	{
    		sTextAngle=180;
    	}
    	else
    	{
    		sTextAngle=0;
    	}
    }

    Сохраняем и обновляем наши объекты:

    Спойлер

     

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

    anY = angleTwoPi(oY,vecPlane);
    anX = angleTwoPi(oY,vecDirection);
    pnt1x = pntOrigin:x;
    pnt1y = pntOrigin:y;
    if (anX==180 && anY==90)
    {
    	pntOrigin:x = pnt1x - L;
    	vecPlane=-vecPlane;
    }
    if (anX==90 && anY==0)
    {
    	pntOrigin:x = pnt1x - B;
    	vecDirection=-vecDirection;
    }

    Примеры моих объектов, с применение данной логики для отзеркаливания:

    Спойлер
    Спойлер

     

×
×
  • Создать...