Как вставить таблицу excel в archicad

REDMOND

Вставка таблиц из Excel

P.S. решить задачу можно через Grasshopper )))
и самое интересное — это будет работать!

Grasshopper работает с данными
ему без разницы работать с ними в 3д или 2д
у него есть инструменты импорта данных из *.xls или *.csv
из этих данных он может формировать 2д таблицу
которая потом и связывается с ArchiCAD
все данные обновляться при их изменении

это будет "как из пушки по воробьям"
но это избавляет архикад от довольно значительного минуса

CADmaster

Журнал Archicad и Excel: особенности автоматизации обмена данными

Archicad и Excel: особенности автоматизации обмена данными

Скачать статью в формате PDF — 3.88 Мбайт

Главная » CADmaster №1(92) 2020 » Архитектура и строительство Archicad и Excel: особенности автоматизации обмена данными

Здравствуйте, меня зовут Александр Крылов. Уже около девяти лет я активно пользуюсь программой Archicad, а в этой статье хочу рассказать о своих способах организации взаимодействия таких программ, как Archicad и Excel.

Почему для своей работы я выбрал эти программы? Excel давно занял нишу стандартной базовой программы в управленческих фирмах и в компаниях, занимающихся финансами. А из имеющихся на российском рынке программ для BIM-проектирования Archicad лучше всего подходит для концептуального информационного моделирования с последующим быстрым извлечением данных из BIM-модели: даже не имея готового шаблона, на свежеустановленном дистрибутиве можно довольно быстро создать концептуальную модель здания. Кроме того, Archicad обладает дружелюбным и понятным интерфейсом. Я всегда смогу объяснить даже по телефону, куда нужно нажать и что нужно сделать, если вдруг срочно понадобится произвести те или иные действия с проектом. В свою очередь необходимые для большинства рабочих процессов функции программы доступны «из коробки». Например, сохранение таблицы в формат XLSX. Для этого не требуется установка каких-либо дополнительных плагинов или написание специального кода — в отличие от конкурирующих программ для проектирования. А сам экспорт таблицы будет произведен с максимальным сохранением внешнего вида, без потери шрифтов, изображений, ширины столбцов и рамок. Это будет хорошо видно на примерах, которые я приведу ниже.

Пример: простой проект бизнес-центра

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

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

В ходе работы проект начинает обрастать всё большим количеством информации. Это один из принципов BIM-проектирования — наполнение проекта информацией. И чтобы не запутаться, следует взять за правило корректно именовать виды, каталоги, слои, пытаться все это систематизировать в карте видов А если точнее, то нужно всегда использовать предварительно настроенный шаблон. Я же буду использовать стандартный шаблон проекта Archicad, чтобы показать, как с нуля настраивается связь Archicad и Excel.

Я разместил на макете план первого этажа (рис. 1), экспликацию помещений, каталог с площадью этажа, а также специально настроенный каталог с разбивкой помещений на нужные категории. Это «Арендная площадь» и «Другая площадь». Нужные мне категории предварительно создал в соответствующем меню (рис. 2).

Расчет коэффициента рентабельности этажа

Теперь опишу, для чего я решил разбить всю площадь на две категории. Важным параметром определения экономической эффективности задуманной планировки является так называемый «Коэффициент рентабельности этажа». Его формула выглядит так:

площадь арендных помещений ÷ площадь этажа

Соответственно, общий коэффициент всего здания будет выглядеть как

сумма всех арендных площадей ÷ суммарную площадь всех этажей

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

Давайте немного отвлечемся и вспомним 22-ю версию Archicad, в которой появилось очень важное и долгожданное нововведение — формулы. Данный инструментарий реализован через создание пользовательских свойств в менеджере свойств. И это огромный плюс, так как формулы не привязываются к каталогу, ячейке, как в Excel, а выполняют роль пользовательского свойства того или иного объекта. Поэтому мы можем использовать формулы не только в каталогах, но и в выносных надписях, графических заменах, при поиске объектов

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

Поэтому, чтобы решить задачу, придется воспользоваться сторонними средствами. Наиболее подходящим будет Excel, так как эта программа позволяет работать с формулами, а сам Archicad умеет экспортировать каталоги в формат XLSX. Экспорт каталогов из Archicad не занимает много времени и делается буквально в три клика. Хочу заметить, что простой ручной подсчет в таблице нам не нужен. Нам важно сделать так, чтобы был автоматизирован практически весь процесс. Чтобы при изменении какого-либо значения в проекте все автоматически пересчитывалось и подставлялось в нужные нам места. Сделать это несложно, и общая схема процесса будет выглядеть так, как показано на рис. 3.

Я покажу весь этот процесс на примере подсчета коэффициента рентабельности.

Экспорт каталогов в формат XLSX

Сначала мы экспортируем каталоги в формат XLSX (рис. 4−5). Если открыть эти файлы, то можно заметить, что внешний вид таблиц остался прежним. Присутствуют даже изображения.

Следует отметить, что при сохранении Archicad предложит такое же имя, как в названии самого каталога. Если при создании каталогов вы называли их по какому-то алгоритму, то процесс сохранения и поиска данных будет проходить у вас очень быстро. Также рекомендуется создать папку, отведенную только для экспортируемых файлов XLSX, чтобы впоследствии быстрее осуществлять доступ к экспортируемым данным.

Создание нового файла формата XLSX

После экспорта каталогов из Archicad необходимо создать новый файл формата XLSX. Это основной файл, в котором будут собираться данные и который мы будем использовать при импорте в Archicad.

Откроем этот файл и в первом столбце сразу зададим наименование рассчитываемого значения: «Коэффициент рентабельности». А во втором столбце пропишем формулу для подсчета этого коэффициента. Формула прописывается таким образом, чтобы данные для подсчета поступали из таблиц, которые мы экспортировали из Archicad. Для этого нам нужно изначально открыть все таблицы, из которых мы хотим брать данные. Вспомним, что нужная нам формула выглядит так:

площадь арендных помещений ÷ площадь этажа

Для этого в строке формул нашей таблицы записываем (рис. 6):

Рис. 6Рис. 6

Переходим к таблице с площадью арендных помещений и щелкаем по ячейке с нужными данными (рис. 7).

Снова переходим в строку записи формулы и ставим знак / (разделить). Затем переходим к таблице с площадью этажа и щелкаем по ячейке с нужными нам данными (рис. 8).

Рис. 8Рис. 8

Возвращаемся в файл, где записываем формулу для расчетов, и в строке формул жмем Enter. Всё, теперь можно закрыть каталоги, экспортируемые из Archicad. При необходимости оформляем внешний вид таблицы: рисуем рамку, задаем нужный шрифт, округляем полученное значение (рис. 9).

Сохранение таблицы в формат PDF

Далее мы можем, конечно же, просто выделить нашу таблицу, скопировать содержимое в буфер обмена, а затем вставить в Archicad как текст или изображение, благо Archicad позволяет нам воспользоваться и таким способом импорта данных. Но этот способ работы с данными нам не подходит, так как при малейшем изменении каких-либо значений в проекте потребуется много ручной работы. Да и слишком он «грязен» для проекта, если вставлять текстом. Для того чтобы мы могли автоматизировать процесс обновления данных из Excel в Archicad, будем пользоваться сохранением таблицы в формат PDF. Это еще один формат, с которым Archicad прекрасно работает «из коробки», позволяя размещать его во всех проекциях и макетах проекта. Что немаловажно, он по умолчанию автоматически обновляет данные из ссылочного документа.

Сохраним нашу таблицу в формат PDF и импортируем документ в Archicad. Затем разместим в нужном месте на макете и зададим нужную область видимости (рис. 10).

Создание макроса для автоматического сохранения PDF

Теперь значение будет автоматически меняться при изменении значения в PDF. Но это еще не автоматизированный способ. Чтобы Excel автоматически пересохранял лист PDF с тем же именем при смене данных, мы можем записать макрос в нашу таблицу с подсчетом коэффициента рентабельности. Макрос — это определенный повторяющийся алгоритм действий, который можно записать в виде микропрограммы. Для этого в нашей созданной таблице следует перейти на вкладку Разработчик (если она неактивна, включите ее в меню Файл/Параметры/Настроить ленту) и нажать иконку Запись макроса. В открывшемся окне вводим имя макроса и определяем место сохранения макроса. Выбираем сохранение в этой же книге, чтобы его не потерять. Нажимаем ОK (рис. 11).

Рис. 11Рис. 11

Всё, началась запись макроса — то есть запись наших действий, которые мы хотим автоматизировать. Начинаем производить эти действия. Перед сохранением в PDF нам обязательно нужно обновлять данные из связанных таблиц. Для этого переходим на вкладку Данные. Выбираем пункт Изменить связи. В открывшемся окне выбираем наши присоединенные таблицы и для каждой нажимаем Обновить (рис. 12).

Рис. 12Рис. 12

После обновления закрываем окно. Переходим во вкладку Файл и сохраняем PDF с правильным именем в нужном месте. В нашем случае файл PDF уже существует, поэтому его нужно сохранить с заменой (рис. 13).

Рис. 13Рис. 13

Затем переходим во вкладку Разработчик и останавливаем запись макроса, после чего сохраняем нашу таблицу, выбирая тип файла с поддержкой макросов (рис. 14).

Рис. 14Рис. 14

Автоматический запуск макроса

Теперь при открытии этой таблицы нам просто понадобится запустить наш макрос, и все действия по обновлению связей и сохранению в PDF произойдут автоматически. Пойдем дальше и еще больше автоматизируем процесс. Для удобства данный макрос можно настроить на автоматический запуск при открытии файла. Для этого переходим на вкладку Разработчик и запускаем редактор Visual Basic. Выбираем наш макрос во вкладке Modules и копируем текст макроса в буфер обмена (рис. 15).

Затем выбираем вкладку ЭтаКнига, открываем в выпадающем окне Workbook и Open и вставляем наш скопированный текст (рис. 16). Сохраняем и закрываем.

Таким образом, мы включили автоматический запуск макроса при открытии файла. Теперь при каждом открытии этой таблицы Excel будет автоматически пересчитывать значение коэффициента и сохранять лист в PDF без запроса пользователя, что весьма удобно.

А так как в Archicad данный лист PDF настроен на автоматическое обновление, то данные будут обновляться и там. Необходимо лишь при изменении площади этажа или площади арендных помещений экспортировать эти таблицы из Archicad в то же место и с тем же именем с заменой существующего файла (рис. 17).

Рис. 17Рис. 17

Для того чтобы при изменении значений проекта в Archicad не утруждать себя открытием и пересохранением каждой таблицы, можно просто настроить экспорт всех этих таблиц через публикатор. Естественно, выбрав для сохранения ту папку, из которой берутся связи для расчетов.

Импорт графиков и диаграмм из Excel в Archicad

Мы можем импортировать из Excel не только таблицы с подсчетами, но и графики и диаграммы. Построим простую диаграмму на основе данных площадей первого этажа. Сама схема импорта в Archicad будет такой же — через PDF. И для того чтобы не создавать огромное количество новых XLSX-файлов, не запутаться при их запуске для обновления данных, мы продолжим работу в файле, который создавали ранее. Для этого просто создадим новый лист и назовем его Диаграмма (рис. 18).

Рис. 18Рис. 18

Далее через меню ленты ВСТАВКА создаем нужную нам диаграмму (рис. 19).

Затем нам следует выбрать данные, которые будут необходимы для построения диаграммы (рис. 20).

Рис. 20Рис. 20

Для этого нам, как и в прошлый раз, необходимо будет открыть экспортируемую из Archicad таблицу с площадями и в открытой таблице выделить нужные столбцы для подсчета. При выделении следует выбирать и названия столбцов, чтобы впоследствии можно было автоматически сделать подписи к значениям на диаграмме (рис. 21). Нажимаем ОК.

Рис. 21Рис. 21

Настраиваем диаграмму под нужный формат отображения. Далее снова создаем макрос для автоматизации действий с сохранением. Так как предыдущий макрос уже производил действия с обновлением связей, в этот макрос следует записать только выбор соответствующего листа и сохранение диаграммы в формат PDF (рис. 22).

Рис. 22Рис. 22

Алгоритм создания записи макроса остается прежним. После создания макроса снова переходим в редактор Visual Basic и вносим новый макрос в процедуру, автоматически выполняемую при открытии файла. Выбираем созданный макрос и выделяем код (рис. 23).

Затем переходим в пункт ЭтаКнига и вставляем код из буфера обмена сразу вслед за кодом предыдущего макроса (рис. 24).

Всё сохраняем и закрываем. Теперь остается лишь разместить на макете созданный файл PDF (рис. 25).

Принцип действия связи аналогичен. При изменении площадей в проекте необходимо лишь экспортировать (с заменой) каталоги с изменившимися данными из Archicad и открыть файл, содержащий в себе расчеты: тот, в котором находятся расчет коэффициента и диаграмма. Весь этот процесс занимает несколько секунд. Как вы заметили, все расчеты можно делать и в одном файле Excel, но создавая каждый раз новый лист и дописывая новый макрос. Это обеспечивает определенное удобство, так как не нужно постоянно открывать большое количество файлов для обновления PDF.

Другие возможности организации взаимодействия

Это был лишь один из примеров организации взаимодействия. Связывая две программы через PDF, мы можем использовать все преимущества Excel. Составлять свою настраиваемую таблицу с данными, выгруженными из Archicad, и размещать ее в проекте. Производить более сложные расчеты, недоступные в среде Archicad. Легко наполнять макеты дополнительными наглядными графиками, диаграммами. Также есть возможность использовать вместе с программой Excel средство визуализации данных POWER BI. А импорт через PDF позволяет разместить на макетах бизнес-аналитику — в три клика и без программирования сложных кодов, что выгодно отличает Archicad от конкурентов.

Описывая взаимодействие этих двух программ, нельзя не упомянуть встроенный в Archicad инструмент импорта и экспорта значений свойств элементов в виде электронных таблиц (рис. 26).

Рис. 26Рис. 26

Импорт значений из Excel в Archicad

Archicad позволяет не только экспортировать значения в формат XLSX, но и импортировать измененные в таблице значения в проект. Попробую продемонстрировать такую возможность на примере коэффициента рентабельности. Прежде всего создадим эти свойства в менеджере свойств. Для стандартизации поместим их в группу ТЭПы (рис. 27).

Для каждого значения следует выбрать тип данных «Число» (это нужно для корректного отображения и округления в дальнейшем, ведь сам коэффициент — числовое значение). Для того чтобы мы могли взаимодействовать с этими свойствами в проекте, создавать каталоги, они должны принадлежать какому-либо элементу в классификации. Я выбрал морф, так как этот инструмент меньше всего используется в проектах для вычислений (сделаю оговорку и скажу, что это я редко использую этот элемент при BIM-проектировании. Другие, возможно, используют его чаще).

Теперь создадим нетвердотельный морф и разместим его на неиспользуемом слое — например, на стандартном слое «Скрыт». Этот морф создается для того, чтобы мы смогли идентифицировать созданные нами свойства и занести их в каталог для подсчетов. Грубо говоря, созданный морф будет объектом хранилища наших ТЭПов, и его ни в коем случае нельзя удалять. Поэтому лучше всего размещать такие объекты на неиспользуемом и выключенном слое. Дальше требуется только создать каталог и оформить его внешний вид (рис. 28).

Теперь мы можем воспользоваться экспортом таблицы в формат XLSX. Но в этот раз применим другой инструмент экспорта из Archicad, Файл/Взаимодействие/Классификации и свойства. Сохраняем этот каталог, а затем открываем его (рис. 29−30).

При таком способе из каталога Archicad происходит выгрузка именно данных, а не внешнего вида таблицы. Поэтому для импорта в Archicad формат PDF использоваться не будет и, следовательно, тратить время на оформление таблицы не следует. Но для подсчета коэффициентов необходимо снова записать формулы в ячейки данных. Процесс записи формул идентичен предыдущему способу. После записи всех формул сохраняем файл. При изменении значений в ссылочных каталогах необходимо будет заново открывать этот файл для обновления значений. При каждом открытии файла Excel будет запрашивать у нас обновление связей. Всегда выбираем Обновить, а затем закрываем с сохранением.

Возвращаемся в Archicad. Переходим в Файл/Взаимодействие/Классификации и свойства и теперь выбираем импорт значений свойств. Для импорта выбираем нашу таблицу, в которой мы прописали формулы (рис. 31).

При импорте Archicad спросит, какие именно значения следует извлечь в каталог. Так как при создании свойств в типе данных мы использовали «Число», при импорте числовые значения автоматически округляются до сотых (исходя из настройки окружающей среды Archicad). Теперь остается просто разместить каталог на листе (рис. 32).

Рис. 32Рис. 32

Таким образом, мы создали и разместили стандартный каталог, внешний вид которого настраивается в самой среде Archicad. Ведь этот каталог, при определенных его размерах, можно автоматически размещать на нескольких листах или разбивать на две таблицы. При использовании PDF, без настройки внешнего вида в среде Excel, так сделать не получится.

Кроме того, используя этот способ взаимодействия, мы можем внести с помощью Excel формулы в специально созданные пустые ячейки каталога. Например, возвращаясь к нашему коэффициенту рентабельности, в каталоге с площадями «Арендная площадь» и «Другая площадь» мы можем создать пустое поле и использовать его для отображения этого коэффициента. Настроив экспортируемую таблицу и используя импорт данных, мы можем автоматически обновлять это значение без риска ошибиться в подсчетах. Единственное, что для обновления данных этого каталога всегда придется пользоваться импортом значений — и это, пожалуй, главный минус представленного способа.

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

Об авторе

Александр Крылов начал проектную деятельность в 2013 году. Работал над проектом гостиницы в центре Москвы, разрабатывал проекты загородных жилых домов, частных интерьеров и частного музея. В 2017-м был назначен ведущим архитектором по нескольким объектам исторических парков «Россия — моя история». В составе группы архитекторов работал над проектом главного храма ВС РФ в парке «Патриот». Входил в команду архитекторов, проектировавших благоустройство территории музея-заповедника «Херсонес Таврический».

Ведущий специалист-архитектор девелоперской фирмы ICM. Осуществляет разработку коммерческо-деловых центров компании, а также проработку существующих офисных центров.

Как вставить таблицу excel в archicad

Этот пример показывает один из простых вариантов использования LabPP_Automat. Он находится в дистрибутиве.
Достаточно немного поэкспериментировать с этим примером чтобы получить представление о гибкости и функциональности возможностей автоматизации.
Текстовые файлы программных скриптов позволяют вносить изменения и полностью менять все что Вы видите.
В каталоге tsprglist Вы можете создать рядом копию каталога "Ландшафтный дизайн с ценами" и дать ему собственное название.
А затем сразу приступить к созданию собственной системы автоматизации на базе своей собственной новой конфигурации. Создавать кнопки, программы, задавать вид панели LabPP_Automat и т.п.
Конфигураций может быть сколько угодно.

Разбор примера.

Структура каталогов и конфигурации

LabPP_Automat запускается с выбранной конфигурацией. Конфигурация — это каталог с набором скриптов и других файлов, который формирует облик и функционал дополнения в конкретном случае.
При входе в пункт меню ARCHICAD "LabPP_Automat показать/скрыть палитру" программа анализирует каталог tsprglist.
В нем располагаются все конфигурации LabPP_Automat.
Каждая конфигурация является отдельным каталогом.

Расчеты в ARCHICAD
Имя каталога конфигурации высвечивается в списке в диалоге выбора конфигурации (см. рисунок).
Каталоги конфигураций имеют одинаковую структуру.
Так каталог конфигурации этого примера содержит подкаталоги tsimages и tsprg:

В самом каталоге "Ландшафтный дизайн с ценами" находятся файлы примера: Прайс.xlsx (открыть в Excel) и Пример.pln (файл ARCHICAD).
Файл Пример.pln содержит объекты библиотеки LabPP_Landscape. Их можно скачать вместе с дистрибутивом здесь на этом сайте.
Каталог tsimages содержит изображения и иконки.
В панели выбора конфигурации рядом с именем конфигурации отображается иконка из файла tsimages\1.png.
Файлы Excel_from.png, Excel_to.png и другие используются в качестве иконок на кнопках.
Каталог tsprg содержит программные скрипты.
Скрипты располагаются в файлах с расширениями *.cpp. Иногда, если нужно использовать часть кода в нескольких файлах *.cpp общая часть может быть вынесена в файл *.h.
В этом примере для простоты используются только файлы *.cpp.
При выборе конфигурации из списка, выполняется файл tsprg\config.cpp.
Вот его содержимое:

ac_request("create_iconbutton","excel_to.png",sx,sy,sx+w,sy+h,"Выгрузить в Excel по одному объекту чтобы можно было назначить цены","ac_to_excel_1.cpp");
sx = sx + w + offsetx;
ac_request("create_iconbutton","excel_from.png",sx,sy,sx+w,sy+h,"Загрузить цены и артикулы в ARCHICAD","excel_to_ac_1.cpp");
sx = sx + w + offsetx;
ac_request("create_iconbutton","select.png",sx,sy,sx+w,sy+h,"Выделить объекты в ARCHICAD из позиции EXCEL","ac_select_pos_excel_1.cpp");
sx = sx + w + offsetx;
ac_request("create_iconbutton","selectexcel.png",sx,sy,sx+w,sy+h,"Показать позицию в EXCEL, соответствующую выделенному объекту ARCHICAD","ac_select_excel_by_ac_1.cpp");
sx = sx + w + offsetx;
ac_request("create_iconbutton","CALC_H256.png",sx,sy,sx+w,sy+h,"Помощь","help.cpp");

Между фигурными скобками располагается выполняемый код.
Комментарием считается текст после двойного // до конца строки или между знаками /* и */

/* это комментарий
на несколько строк*/

Функция ac_request() позволяет выполнять операции с ARCHICAD.
Первым аргументом идет команда. В нашем случае "create_iconbutton" — означает создать кнопку с иконкой.

ac_request("create_iconbutton","excel_to.png",sx,sy,sx+w,sy+h,"Выгрузить в Excel по одному объекту чтобы можно было назначить цены","ac_to_excel_1.cpp");

Следующая строка — имя файла рисунка для иконки. Файл берется из каталога tsimages текущей конфигурации.
Следующие 4 числовых аргумента задают координаты кнопки в окне: левый край, верхний край, ширина и высота кнопки в пикселях.
Следующий текстовый аргумент — пояснение, которое будет показываться при подводе мыши к кнопке.
И последний аргумент — имя файла программного скрипта, который будет выполняться при нажатии на кнопку.
В этом случае — tsprg\ac_to_excel_1.cpp.
Переменные sx,sy и т.д. играют роль для позиционирования кнопок и окна сообщений интерпретатора LabPP_Automat.
Последняя функция задает размеры палитры LabPP_Automat и расположение в нем окна сообщений.

REDMOND

В результате окно этой конфигурации выглядит так:

Вид окна LabPP_Automat в демонстрационной конфигурации

Кнопка "Открыть файл Excel"

Для этого примера мы создали файл Excel с именем "Прайс.xlsx". В нем назвали одну из таблиц "Растения".
Файл поместили в корневой каталог конфигурации "Ландшафтный дизайн с ценами".
Чтобы быстро открыть этот файл мы создали кнопку с иконкой Excel.
При нажатии этой кнопки выполняется программа "open_excel_file.cpp":

int main()
<
shell_func("set_cur_dir","rootconfig"); // сделать текущим корневой каталог текущей конфигурации
shell_func("shellexecute","open","Прайс.xlsx"); // открыть файл "Прайс.xlsx"
>

Обращение к функции shell_func() с директивой "set_cur_dir" позволяет изменить текущий каталог.
Следующей строкой задается либо полный путь к каталогу, либо кодовое слово. В данном случае "rootconfig" означает что мы хотим переместиться в корневой каталог текущей конфигурации (здесь ""Ландшафтный дизайн с ценами").
Следующий вызов функции с директивой "shellexecute" и именем файла обращается к операционной системе чтобы открыть этот файл.

Кнопка помощи

Чтобы легче справиться с освоением этого примера мы подложили под кнопку со знаком вопроса файл help.cpp
При нажатии на кнопку выполняется файл tsprg\help.cpp:

//****************************************************
int main()
<
cout << "Демонстрационная программа по\n загрузке/выгрузке данных между ARCHICAD и EXCEL.\n";
cout << "Откройте файл Прайс.xslx \n(в каталоге этой конфигурации).\n";
cout << "Поставьте в своем проекте несколько\nобъектов из библиотеки LabPP_Landscape.\n";
cout << "Выделите эти объекты\n";
cout << "Нажмите первую кнопку со стрелкой ->X \nчтобы выгрузить список видов объектов в EXCEL.\n";
cout << "Измените артикулы и цены.\n";
cout << "Выделите в ARCHICAD объекты, у которых нужно заменить данные";
cout << "Нажмите кнопку со стрелкой X-> чтобы загрузить\n измененные данные в объекты в Ваш проект ARCHICAD.\n";
cout << "Можно выделить ячейку с наименованием\nэлемента в таблице EXCEL и нажать кнопку с квадратиком.\n";
cout << "В результате в ARCHICAD будут выделены\nвсе объекты с этим наименованием";
cout << "Можно выделить объект в ARCHICAD\nкоторому соответствует ячейка в EXCEL\n";
>
//****************************************************

Здесь содержатся простык стандартные выражения вывода на экран.
Вывод осуществляется в окно сообщений.

cout << "Демонстрационная программа по\n загрузке/выгрузке данных между ARCHICAD и EXCEL.\n";

cout << "текст" << variable << "\n";
Так можно писать чтобы перемежать текстовые сообщения, значения переменных и если где-то поставить "\n" то это будет переход на следующую строку.

После каждого оператора должна быть точка с запятой.

Кнопка выгрузки из ARCHICAD в Excel

Перед нажатием откройте файл Прайс.xlsx.
По нажатию этой кнопки запускается программа из файла ac_to_excel_1.cpp:

res = excel_request("workbook_select","Прайс.xlsx");
if(res!=0)
res = excel_request("sheet_select","Растения");
if(res!=0)

ac_request("load_elements_list_from_selection",4,"ObjectType","MainFilter",4+2);
ac_request("get_loaded_elements_list_count",4);
int iObjectCount = ac_getnumvalue();

int TableDescr1;
object("create","ts_table",TableDescr1);
ts_table(TableDescr1, "add_column",0,"string","наименование объекта");
ts_table(TableDescr1, "add_column",1,"string","артикул");
ts_table(TableDescr1, "add_column",2,"double","цена");
ts_table(TableDescr1, "set_first_key","наименование объекта"); // устанавливаем колонку как ключевую (не будет одинаковых значений в ней);

string objectname;
string articul;
double price;
for(int i=0;i<iObjectCount; i++)
<
ac_request("set_current_element_from_list",4,itoa(i));
ac_request("get_object_property_value","LabPP_IGRo_Artikul");
articul = ac_getstrvalue();
ac_request("get_object_property_value","ObjectName");
objectname = ac_getstrvalue();
ac_request("get_object_property_value","LabPP_IGRo_Cost");
price = ac_getnumvalue();

ts_table(TableDescr1,"add_row",0,objectname,1,articul,2,price); // добавляем строку в нашу таблицу. После "add_row" перечисляются номер колонки и значение, номер колонки, значение и т.д. может быть не по порядку, могут быть не все колонки.
>

Последний оператор цикла — добавление строки в таблицу.
Т.к. мы задали инструкцией "set_first_ker" ключевую колонку — в таблицу не добавится строка, если имя объекта будет совпадать с уже имеющимся.
Тогда данные других полей заместятся новыми. В инструкции "add_row" могут присутствовать не все колонки.
Если вместо "add_row" использовать инструкцию "add_row_sum", то значения числовых колонок будет суммироваться с уже имеющимися в этой строке.
Это очень удобно.

Дальше сортируем таблицу по колонке 0.

int rowcount;
ts_table(TableDescr1,"get_rows_count", rowcount);

string srange = get_posd("A",1);
excel_select_range(srange);
excel_putstrvalue("Название объекта");
srange = get_posd("B",1);
excel_select_range(srange);
excel_putstrvalue("Артикул");
srange = get_posd("C",1);
excel_select_range(srange);
excel_putstrvalue("Цена");

for(i=0;i<rowcount;i++)
<
ts_table(TableDescr1,"select_row",i);
ts_table(TableDescr1,"get_value_of",0,objectname);
ts_table(TableDescr1,"get_value_of",1,articul);
ts_table(TableDescr1,"get_value_of",2,price);

srange = get_posd("A",i+2);
excel_select_range(srange);
excel_putstrvalue(objectname);
srange = get_posd("B",i+2);
excel_select_range(srange);
excel_putstrvalue(articul);
srange = get_posd("C",i+2);
excel_select_range(srange);
excel_putnumvalue(price);
>

excel_detach(); // отключаем Excel

cout << "\nЗавершение работы программы \n";
ac_save_messages_to_file("c:\\LabPP_Automat_1.rep"); // записываем текст окна сообщений в файл
>

Разберем подробно текст программного скрипта. Может показаться сложным на первый взгляд. Однако на самом деле все легко читается.
Начнем с конца.
За пределами фигурных скобок функции main() находится описание еще одной функции.

// Составить строку-адрес ячейки Excel

string get_posd(string ch, int row)
<
string sposd=ch+itoa(row)+":"+ch+itoa(row);
return sposd;
>

Ее удобно использовать чтобы сформировать адрес ячейки в таблице Excel.
На входе мы подаем строку с буквой колонки (например "А") и номером строки.
На выходе получаем строку "A1:A1".

Вернемся и пойдем с начала функции main().
Следующий фрагмент подключает Excel.

int res;
res = excel_attach(); // подключаем текущую таблицу Excel
if(res != 0) <
cout << "ошибка подключения к Excel";
return -1;
> else <
cout << "ok\n";
>

Функция excel_attach() подключает LabPP_Automat к открытой программе Excel.
Если операция прошла успешно, то возвращается 0. В ином случае -1. Тогда мы выдаем сообщение в окно сообщений и прекращаем выполнение скрипта.
Конструкция if в языке C++ пишется так:

if(условие)
<
// здесь если условие истинно
>
else if (еще условие)
<
// здесь если еще условие истинно
>
else
<
// здесь — если все было ложно
>

Блоки else if и else могут отсутствовать.
В отличии от классического C++, ограничение интерпретатора LabPP_Automat в том, что фигурные скобки должны присутствовать обязательно.

Следующий фрагмент выбирает нужный файл и страницу в нем:

res = excel_request("workbook_select","Прайс.xlsx");

if(res!=0)
res = excel_request("sheet_select","Растения");
if(res!=0)

При неудаче выдаем сообщение в окно сообщений и заканчиваем работу.
Или идем дальше. Выдаем сообщение о том, что мы продолжаем.

Делаем выборку из элементов.

ac_request("load_elements_list_from_selection",4,"ObjectType","MainFilter",4+2);
ac_request("get_loaded_elements_list_count",4);
int iObjectCount = ac_getnumvalue();

Инструкция "load_elements_list_from_selection" записывает все текущие выбранные элементы ARCHICAD в список с определенным номером.
LabPP_Automat предоставляет для работы 10 списков элементов. Здесь задействован список №4. Индекс идет от 0 до 9.
Здесь имеются уточнения — элементы должны быть типа "объект".
При этом фильтр оставляет только элементы на видимом слое и редактируемые (значение флага 4+2).
Инструкция "get_loaded_elements_list_count" запрашивает LabPP_Automat сколько элементов загружено в список.
Результат получаем функцией ac_getnumvalue();
Выдаем количество объектов в выборке на экран в окно сообщений.

Далее идет работа с динамической таблицей. Это очень удобный инструмент LabPP_Automat.
Таблица может содержать переменное количество колонок, строк, может сортироваться (строки упорядочиваются по колонке), можно организовывать быстрый поиск нужной строки.
Особенная удобная возможность: можно сделать так, чтобы в клонках данные автоматически суммировались числовые значения у одинаковых элементов.
Таблица создается как объект. Объект имеет дескриптор. Это целое число.

int TableDescr1;
object("create","ts_table",TableDescr1); // создать объект типа "ts_table"
ts_table(TableDescr1, "add_column",0,"string","наименование объекта"); // добавить колонку типа строка с именем "наименование объекта"
ts_table(TableDescr1, "add_column",1,"string","артикул");
ts_table(TableDescr1, "add_column",2,"double","цена"); // добавить колонку типа число с плавающей точкой с именем "цена"
ts_table(TableDescr1, "set_first_key","наименование объекта"); // ключевым сделать колонку "наименование объекта"

После того, как шаблон таблицы создан, заполняем ее значениями.

string objectname;
string articul;
double price;
for(int i=0;i<iObjectCount; i++) // обрабатываем в цикле все объекты выборки
<
ac_request("set_current_element_from_list",4,itoa(i)); // устанавливаем текущим элемент с номером i
ac_request("get_object_property_value","LabPP_IGRo_Artikul"); // считываем из этого объекта значение переменной LabPP_IGRo_Artikul
articul = ac_getstrvalue(); // записываем считанное значение во временную переменную articul
ac_request("get_object_property_value","ObjectName");
objectname = ac_getstrvalue();
ac_request("get_object_property_value","LabPP_IGRo_Cost");
price = ac_getnumvalue(); // записываем значение цены во временную переменную price. Обратите внимание здесь численное значение а не строка.

ts_table(TableDescr1,"sort",0); // сортировать (упроядочить) строки в таблице по колонке 0

Теперь выкладываем таблицу в Excel.

int rowcount;
ts_table(TableDescr1,"get_rows_count", rowcount); // определить количество строк в таблице;

string srange = get_posd("A",1); // объявляем строковую переменную srange и сразу записываем туда строку адрес ячейки таблицы Excel
excel_select_range(srange); // фокусируем эту ячейку в Excel
excel_putstrvalue("Название объекта"); // записываем текст в ячейку.
srange = get_posd("B",1);
excel_select_range(srange);
excel_putstrvalue("Артикул");
srange = get_posd("C",1);
excel_select_range(srange);
excel_putstrvalue("Цена");

В цикле получаем значения из таблицы и записываем их в позиции Excel

for(i=0;i<rowcount;i++)
<
ts_table(TableDescr1,"select_row",i); // выбрать текущую строку № i
ts_table(TableDescr1,"get_value_of",0,objectname); // считать значение колонки №0 в переменную objectname;
ts_table(TableDescr1,"get_value_of",1,articul);
ts_table(TableDescr1,"get_value_of",2,price);

srange = get_posd("A",i+2);
excel_select_range(srange);
excel_putstrvalue(objectname); // записать строковое значение в ячейку A строки i+2;
srange = get_posd("B",i+2);
excel_select_range(srange);
excel_putstrvalue(articul);
srange = get_posd("C",i+2);
excel_select_range(srange);
excel_putnumvalue(price); // записать числовое значение в ячейку Б строки i+2;
>

После работы удаляем объект таблицы по дескриптору TableDescr1:

excel_detach(); // отключаем Excel

Сообщаем в окно сообщений, что программа закончилась успешно.

cout << "\nЗавершение работы программы \n";

Записываем (если нужно) окно сообщений в файл для дальнейшего анализа.

ac_save_messages_to_file("c:\\LabPP_Automat_1.rep"); // записываем текст окна сообщений в файл

Кнопка загрузки из Excel в ARCHICAD

Кнопка запускает программный скрипт из файла excel_to_ac_1.cpp:

res = excel_request("workbook_select","Прайс.xlsx");
if(res!=0)
res = excel_request("sheet_select","Растения");
if(res!=0)

int TableDescr1;
object("create","ts_table",TableDescr1);
ts_table(TableDescr1, "add_column",0,"string","наименование объекта");
ts_table(TableDescr1, "add_column",1,"string","артикул");
ts_table(TableDescr1, "add_column",2,"double","цена");
ts_table(TableDescr1, "set_first_key","наименование объекта");

string objectname=" ";
string articul;
double price;
string srange;

for(int i=0;1==1;i++)
<
srange = get_posd("A",i+2);
excel_select_range(srange);
objectname = excel_getstrvalue();
srange = get_posd("B",i+2);
excel_select_range(srange);
articul = excel_getstrvalue();
srange = get_posd("C",i+2);
excel_select_range(srange);
price = excel_getnumvalue();
if(objectname == "")

ts_table(TableDescr1,"add_row",0,objectname,1,articul,2,price);
cout << "артикул=" << articul << " название объекта=" << objectname << " цена="<< price <<"\n";
>

cout << "\nИмпортируем цены и артикулы";

ac_request("load_elements_list_from_selection",4,"ObjectType","MainFilter",4+2);
ac_request("get_loaded_elements_list_count",4);
int iObjectCount = ac_getnumvalue();

for(int i=0;i<iObjectCount; i++)
<
ac_request("set_current_element_from_list",4,itoa(i));
ac_request("get_object_property_value","ObjectName");
objectname = ac_getstrvalue();
// найти в таблице значение
int irow = ts_table(TableDescr1,"search",0,objectname);
if(irow != -1)
<
ts_table(TableDescr1,"select_row",irow);

excel_detach(); // отключаем Excel

cout << "\nЗавершение работы программы \n";
ac_save_messages_to_file("c:\\LabPP_Automat_2.rep"); // записываем текст окна сообщений в файл
>

В начале программы идет уже известный фрагмент подключения к Excel с файлом и таблицей.
Дальше идет создание объекта таблицы ts_table для загрузки из Excel.

int TableDescr1;
object("create","ts_table",TableDescr1); // создать объект типа ts_table и сохранить числовой дескриптор в переменную TableDescr1
ts_table(TableDescr1, "add_column",0,"string","наименование объекта"); // добавить строковую колонку с заголовком
ts_table(TableDescr1, "add_column",1,"string","артикул");
ts_table(TableDescr1, "add_column",2,"double","цена"); // добавить числовую колонку
ts_table(TableDescr1, "set_first_key","наименование объекта"); // задать ключевую колонку

Дальше в цикле считываем данные из Excel и заполняем таблицу

for(int i=0;1==1;i++) // "бесконечный цикл", где переменная i увеличивается всякий раз на 1
<
srange = get_posd("A",i+2); // сформировать строку адреса ячейки
excel_select_range(srange); // выделить ячейку в Excel
objectname = excel_getstrvalue(); // считать текстовое значение в переменную objectname
srange = get_posd("B",i+2);
excel_select_range(srange);
articul = excel_getstrvalue();
srange = get_posd("C",i+2);
excel_select_range(srange);
price = excel_getnumvalue(); // считать числовое значение в переменную price (цена)
if(objectname == "") // если в переменной objectname оказалась пустая строка (ячейка Excel пустая, т.к. достигнут конец списка)
// то выйти из цикла, т.е. закончить считывание из Excel
ts_table(TableDescr1,"add_row",0,objectname,1,articul,2,price); // добавить запись в таблицу с дескрипторомTableDescr1
cout << "артикул=" << articul << " название объекта=" << objectname << " цена="<< price <<"\n"; // написать в окне сообщений то, что мы считали.
>

Теперь отсортируем ts_table, т.е. упорядочим записи в ней по колонке №0 ("Наименование объекта")

Сформируем список объектов ARCHICAD в списке №4

ac_request("load_elements_list_from_selection",4,"ObjectType","MainFilter",4+2);
ac_request("get_loaded_elements_list_count",4);
int iObjectCount = ac_getnumvalue();

Выборка будет содержать элементы типа объект, видимые и доступные для редактирования ("MainFilter",4+2).
Количество объектов в выборке запишем в переменную iObjectCount.
Перебираем последовательно все объекты из списка №4.

for(int i=0;i<iObjectCount; i++)
<
ac_request("set_current_element_from_list",4,itoa(i)); // сделать текущим объект i в списке №4
ac_request("get_object_property_value","ObjectName"); // считать название объекта
objectname = ac_getstrvalue(); // записать последнее считанное значение в переменную objectname
// найти в таблице значение
int irow = ts_table(TableDescr1,"search",0,objectname); // задать поиск в таблице ts_table с дескриптором TableDescr1 по полю №0 на соответствие имени объекта из ARCHICAD.
// если значение не найдено — то irow будет содержать число -1. Иначе число будет означать номер строки в таблице ts_table
if(irow != -1) // если такая строка есть (в таблице есть строка с совпадающим названием объекта)
<
ts_table(TableDescr1,"select_row",irow); // сделать эту строку текущей

ts_table(TableDescr1,"get_value_of",1,articul); // считать значение артикула
ts_table(TableDescr1,"get_value_of",2,price); // считать значение цены

ac_request("set_object_property_value","LabPP_IGRo_Artikul",articul); // записать артикул в переменную "LabPP_IGRo_Artikul" текущего объекта
ac_request("set_object_property_value","LabPP_IGRo_Cost",price); // записать цену в переменную "LabPP_IGRO_Cost" текущего объекта
>
>

Осталось удалить таблицу ts_table из памяти и отключиться от Excel

object("delete",TableDescr1);
excel_detach(); // отключаем Excel

Найти строку в EXCEL по выбранному объекту ARCHICAD

Программа скрипта находится в файле ac_select_excel_by_ac_1.cpp:

res = excel_request("workbook_select","Прайс.xlsx");
if(res!=0)
res = excel_request("sheet_select","Растения");
if(res!=0)

ac_request("load_elements_list_from_selection",4,"ObjectType","MainFilter",4+2); // загрузить в список №4 выбранный элемент ARCHICAD
ac_request("get_loaded_elements_list_count",4);
int iObjectCount = ac_getnumvalue();
if(iObjectCount == 0) // если количество элементов в списке равно нулю — то нечего показывать в таблице Excel
<
cout << "\nне выделены объекты в ARCHICAD";
return -1;
>

ac_request("set_current_element_from_list",4,0); // взять первый элемент ARCHICAD из списка №4 (индекс в списке — 0)
ac_request("get_object_property_value","ObjectName"); // считать имя объекта
string objectname_to_select;
objectname_to_select = ac_getstrvalue(); // получить в переменную objectname_to_select считанное значение

string srange;
string objectname;
for(int i=0;1==1;i++) // в цикле перебрать все наименования объектов в колонке "Наименование объекта" ("A") в таблице Excel до пустой ячейки
<
srange = get_posd("A",i+2);
excel_select_range(srange); // сфокусирьвать ячейку Excel
objectname = excel_getstrvalue(); // считать текстовое значение из этой ячейки
if(objectname == "")

if(objectname == objectname_to_select) // если значение в ячейке Excel совпадает с именем объекта ARCHICAD — то остановиться.

>

// Составить строку-адрес ячейки Excel
string get_posd(string ch, int row)
<
string sposd=ch+itoa(row)+":"+ch+itoa(row);
return sposd;
>

Найти объект ARCHICAD по выбранной строке в EXCEL

Нам необходимо считать название объекта из текущей ячейки Excel, найти все объекты в ARCHICAD с таким именем и выделить их.
Программный скрипт, выполняемый по этой кнопке находится в файле ac_select_pos_excel_1.cpp:

res = excel_request("workbook_select","Прайс.xlsx");
if(res!=0)
res = excel_request("sheet_select","Растения");
if(res!=0)

string objectname;
objectname = excel_getstrvalue(); // считать текстовое значение из текущей ячейки Excel
if(objectname!="") // если значение не пустая строка, то
<
ac_request("load_elements_list",4,"ObjectType","ObjectName",objectname,"MainFilter",4+2); // в ARCHICAD считать элементы типа объект с названием из переменной objectname в список №4
ac_request("select_elements_from_list",4); // сделать выбранными в ARCHICAD элементы из списка №4
>
excel_detach(); // отключаем Excel
>

REDMOND

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *