0 Пользователей и 1 Гость просматривают эту тему.

*

SergeyAB

Народ, вопрос ко всем кто знаком с гдл, итак ситуация:

1.Есть объект (*.gsm) назовем его А, который в процессе работы отписывает нужную информацию во внешний текстовый файл, таких объектов в проекте несколько(1...100),и каждый пишет в один и тот же текст-файл " свою" инфу 
2.Есть объект (*.gsm) назовем его Б, который в процессе работы должен прочитать инфу с того текстового файла, поработать с ней и принять вид соответствующий результатам этой работы, т.е Б сводит все данные по объектам А , сортирует плюсует и т.п.
3. Нужно добиться чтобы объект Б был "синхронизирован" с объектами А, т.е. чтобы обрабатывал инфу только от тех объектов А которые присутствуют в проекте на момент создания объекта Б(а,в общем случае в момент вызова команды Rebuild All из меню ArchiCAD)

есть следующие мною непреодоленные проблемы:

1.если я удаляю один из объектов А, то инфа в текстовом файле от него остается ( ибо у объекта нет деструктора(скрипта который выполнится перед удалением объекта из базы проекта)).

2.когда размещаю объект Б, также не могу проверить какие из объектов А действительно есть в проекте(не удалены на момент создания объекта Б)(sql запросы также недоступны из gdl скрипта, а те запросы REQUEST() которые имеются не позволяют получить инфу о наличии/отсутствии объекта в базе)

ну и информация к размышлению - скрипт деструктора написать нельзя потому что некуда....но можно выполнить команду Rebuild All из меню ArchiCAD, по этой команде вновь "прокрутятся" скрипты всех объектов которые есть в проекте,может используя это можно добится чтобы объект Б работал только с "живыми" А а не с теми что отписали инфу в текстовый файл(в текстовом файле может быть инфа от объекта которого уже нет в проекте и работать с ней не надо...).

жду толковых советов, спасибо всем кто откликнется...
« Последнее редактирование: Апреля 04, 2007, 01:24:36 от GAG »

*

Оффлайн SPINCODE

  • **
  • 48
  • Репутация: +5/-0
  • Пол: Мужской
  • Spincode
Нескромный вопрос, а какая решается задача?

*

Оффлайн ALAKK

  • *****
  • 625
  • Репутация: +55/-7
  • Пол: Мужской
  • Он спорил с модером...
Похоже, что глобальная...
Но технологии ООП в GW-бейсике? Интересно... Сам Арч принципиально не поддерживает DDE " OLE  технологии. Жаль, но по-моему это неблагодарный труд. Конечно, если бы SQL  был доступен из  скрипта, вопрос решался бы, если б еще в версии SQL от ГС поддерживались необходимые фразы. Не вижу путей решения. Но подумать стоит...

*

SergeyAB

Скажем так объект А - спецовая спецификация, которую делать через сметное задание - помереть не начав,объект Б - сводная спецификация по спецификациям А, но не сбор всего что в них (А) есть, о тщательно по многим правилам обработанный результат.Объект А уже написан и работает как нуно, а объект Б написать тоже несложно, не могу понять как синхронизировать, точнее знаю, но хочу без С++...

*

Оффлайн ALAKK

  • *****
  • 625
  • Репутация: +55/-7
  • Пол: Мужской
  • Он спорил с модером...
После сообразил.
А может вынести всю обработку из Арча?
Пускай объекты пишутся хоть в один, хоть во сколько файлов. Все состояние системы (объекты в частности) прописывается немедленно в базе Арча - не знаю где, но иначе было бы просто глупо. Через connection долбить ее внешней утилитой типа trigger и устанавливать текущее состояние системы и сравнивать с состоянием файла (ов). При изменении базы править файл в соответствии с ее состоянием. По твоей задаче в запросе и надо-то спросить-указать User_ID и тип объекта.
Хотя, если достучаться до базы Арча, не надо никаких промежуточных файлов.

*

SergeyAB

Хотя, если достучаться до базы Арча, не надо никаких промежуточных файлов.
- это и хочу!!! но походу на Gdl не возможно - объект *gsm, не может знать о том что есть в проекте ничего кроме своего внутреннего ID...

хотя решение еще ищу...и жду толковых советов...

 на Сях решается быстро все, но тут надо либо аддоном оформлять, либо улиту внешнюю через ODBC, а я хочу "малой кровью" - чтоб все в пределах проекта было,чтоб нажал ребилд ол, и все объекты по своим скриптам привели все в соответствие...мануал по gdl изучил но походу нельзя такое к объекту приделать, блин напишу наверно автору GDL чтоб сделал вкладку к объектам gsm - скрипт дескриптора - ведь такая технология получится подумать страшно!!!(надо то всего чтоб объект подчищал за собой внешний контент, также как ODBC удаляет его из базы, можно конечно перекрыть этот обработчик но куда скрипт то писать деструктора??? да и баги непофиксить не в жизнь...это уже разработчикам вопрос), а принципиально дописать то ведь немного,задействовать еще один индекс для скрипта...7-скрипт деструктора(...ну и прописать это в длл...)

*

SergeyAB

Как я и предполагал! Ответ от отцов-создателей:
There are only few ways to get interactive contact out of the gdl-code of objects:

1. The object is feeded by an AddOn
2. Is part of another (skylight, window, door)
3. Is a zone-stamp
4. Is an associative attached label

In all these cases the data stream is unidirectional TO the object. The usage of object-calculation or settings back to the project (as e.g. skylights do) will done, if it`;s possible at all, from mechanisms outside of the gdl-code.

There is no realy good working possibility to interact between two objects. There is a way, posted here a time ago, to interact between two objects by using a textfile or other external stuff. If it`;s not absolutely necessary, I wouldn`;t recommend.

There is one exception:
Labels and markers can REQUEST parameters of the drawing elements they are attached to. Have a look to REQUEST ("ASSOCLP_PARVALUE", .... There is written here something too. Give SEARCH a try. 

And of course there a the GLOBAL parameters and the other REQUESTable global system environments.

There are no GDL-statements to get access to the project database. No SQL-commands. Sorry

*

Оффлайн ALAKK

  • *****
  • 625
  • Репутация: +55/-7
  • Пол: Мужской
  • Он спорил с модером...
Вот-вот. Что и требовалось доказать... К сожалению.
Может задашь им вопрос о расширении ГрСофт версии SQL? Если дополнить их версию фразами to or into (table,array) было бы проще жить. Это позволило бы результат запроса выгрузить во внешнюю таблицу или АС-массив. Это позволит избежать (в какой-то мере - а может и полностью) необходимость в ODBC драйвере. Хотя, имея в запросе такие фразы можно потрошить и саму базу тоже. Видать этого и боятся. Нет бы сделать ее типа Read only для внешних запросов...
Дальше уже дело техники. Причем дополнить желательно начиная с 8.1 версии. Нежелательно выгружать в XML. Это хоть и модно и, говорят, перспективно, но надо иметь совсем другую голову.
Как понял для себя: много коротких запросов исполняются быстрее, чем один полный структурированный запрос. Результат запроса к БД по всем объектам длился минут 20, так я и не дождался выборки, отключил.
...if it`;s possible at all, from mechanisms outside of the gdl-code. Надо все выносить наружу.
Ну, а то, что из этого бейсика ничего похожего на технологии ООП извлечь не удастся, было понятно с самого начала. А жаль. Хотя свои функции в АС он выполняет добросовестно - для чего и предназначен.

*

Оффлайн GAG

  • *****
  • 940
  • Репутация: +129/-1
  • Пол: Мужской
  • GAG
Re: Работа с внешними файлами из GDL объекта
« Ответ #8 : Апреля 04, 2007, 01:31:08 »
Убедительная просьба давать топикам осмысленные названия.
Топик переименовал.

*

Оффлайн ALAKK

  • *****
  • 625
  • Репутация: +55/-7
  • Пол: Мужской
  • Он спорил с модером...
Re: Работа с внешними файлами из GDL объекта
« Ответ #9 : Апреля 04, 2007, 09:18:00 »
Позже сообразил.
Если рассмотреть текщий проект с точки зрения ООП, то получается, что все описываемые пользователем скрипты описывают события уровня объекта. Может задать отцам вопрос-предложение, чтоб они открыли пользователям события и описывающие их переменные уровня окна проета. Тогда не нужно SQL и драйверов. Обойдемся ГДЛовским междусобойчиком. Потребуется описание открытых переменных и запросов. Пускай не в этой версии АС, но в последующих. Если они будут...

*

SergeyAB

Re: Работа с внешними файлами из GDL объекта
« Ответ #10 : Апреля 04, 2007, 09:50:34 »
Ну, а то, что из этого бейсика ничего похожего на технологии ООП извлечь не удастся, было понятно с самого начала. А жаль. Хотя свои функции в АС он выполняет добросовестно - для чего и предназначен.
- Насчет ООП согласен, включить Sql в гдл тоже неполучится...потому что нельзя....потому что нельзя...;-) я тут пораскинул мозги, и действительно пришел к тем же выводам....единственное что я бы хотел еще от разработчиков ArchiCAD - чтоб в объект гдл включили скрипт деструктора - это оччень даже реально на мой взгляд, не нужно ничего сверхъестественного, тот же функциональный набор что и лдя 2D,3D скриптов, все функции по работе с txt, xml, лично я вижу в этом оч. большой потенциал, ибо:
1. Объект Б сможет контроллировать наличие отсутствие А(через узлы xml, через строчки в ткст), и значит отпадет необходимость в поиске объекта через ACDB, т.е. объекты будут работать друг с другом напрямую.
2. Можно будет контроллировать систему из "своих" интеллектуально напичканных объектов, а это как грится уже что то наподобие ООП, ибо имея возможность отслеживая события объекта, можно писать обработчики(!)

А всего то надо, чтобы перед удалением объекта он выполнял некоторый скрипт который будет вызываться перед обработчиком ODBC драйвера...лично я не вижу проблем с включением такого скрипта в стандарт гдл, попробую задвинуть мыслю в забугровском форуме разработчиков...там половина отцов-создателей трет...

*

Оффлайн ALAKK

  • *****
  • 625
  • Репутация: +55/-7
  • Пол: Мужской
  • Он спорил с модером...
Re: Работа с внешними файлами из GDL объекта
« Ответ #11 : Апреля 04, 2007, 22:22:07 »
Удаление/создание объекта - событие не уровня объекта. Как идет опрос состояния системы ты, наверное, знаешь не хуже меня. Как графический объект из своего текущего состояния может производить опрос системы? Это ведь язык интерпретатора, т.е. непосредственного исполнения. К управлению прерываниями он не имеет никакого отношения. Как ты на нем напишешь триггер? Цитата:"Вы ставите нереальные задачи". Единственный, на мой взглд, способ победить вопрос - использование внешней обработки состояния системы. А это ODBC + SQL +FoxPro.

*

SergeyAB

Re: Работа с внешними файлами из GDL объекта
« Ответ #12 : Апреля 05, 2007, 18:45:22 »
Как графический объект из своего текущего состояния может производить опрос системы?
-А никак! Опрос никак! Он(объект А) просто подчистит во внешнем файле(только при наличии скрипта деструктора) инфу о себе(ну грохнет он узел в дереве со своим названием, открой мануал по GDL XML IN/OUT )...а вот другой объект(Б) прочитает все дерево XML документа и таким образом все синхронизируется, Б будет работать только с "живыми" А, либо выдавать сообщение что такой то из А удален(нет такого узла в xml дереве).

Вся фишка в том что:
- нельзя в скрипте объекта Б написать инструкцию типа - читать из xml-файла каждые 2 мин(5 шагов), НО:

- можно прокрутить весь скрипт объекта Б и остальных объектов которые размещены в проекте, а скрипт объекта Б написан так - что прочитает все дерево *.xml, либо все строки из *.Txt, и выберет только то что нужно ему...

а как написать обработчик на событие???(к вопросу о состоянии системы...)

так же точно - допустим в объекте А есть параметр w_type - тип профиля - труба, уголок и т.д., и еще один параметр A_Num - метка объекта А среди остальных объектов А(придется назначать значение вручную,следить чтобы два объекта не имели одинаковых меток, но когда вещи не абстрактны то в этом нет не удобства а наоборот - например первый объект А спецификация на колонну, второй А - на балку, третий - на площадку и.т.д. соответственно в первом объекте A_Num="K1", во втором A_Num="Б1" и т.д.)

Как обработать событие - "изменение параметра w_type"?

Каждый объект А, при размещении на плане отписывает во внешний xml-файл, по след. принципу: создается узел уровня 2(уровень 1(root)-имя проекта(ну или имя указанное пользователем, не суть)), имеющий имя - A_Num, тип - текст, далее поддерево от этого узла  - в нем все что нужно для работы с объектом А объекту Б. С объектом А вроде все объяснил,
далее - размещаем объекты А на плане - настраиваем их - задаем в них все что требуется, назначаем им уникальные метки, таким образом получаем xml -файл со всей информацией из объектов А

Далее размещаем на плане объект Б, скрипт которого примерно следующий:
во первых есть строковой массив(dim A)  в котором руками забиваем имена тех объектов А по которым требуется составить сводную спецификацию, дальше сершинг по xml-дереву на наличие узлов второго уровня с именами из Dim A, ничего сложного, обработка-логика объекта Б,его 2Д скрипт - который и есть результат обработки и все!Имеем Б - сводный по А.
Объект Б сработал по тем объектам А которые перечислены в его параметре - Массиве А.Удобно.Можно иметь N объектов Б которые будут представлять ту или иную инфу, например делаем спецификации на 2 цеха(две группы объектов А), и сводные на 2 цеха по отдельности  два объекта Б, дальше прикидываем сколько нужно металла на первую очередь строительства - создаем еще один Б на определенное количество А из первой группы(например на фермы и прогоны покрытия т.е. пишем в массив А - Ф1,Ф2,Ф3,Ф7,Пр4 (если к примеру эти конструкции составят первую очередь)) Вот так...вопросы?

Дальше - как синхронизировать Б и А?
Т.е. изменили мы параметр w_type в одном из объектов А(через интерфейс объекта) - с уголка на трубу, клик на ок, объект изменился, потому что прокрутились его(только его!!!) скрипты, т.е А отписал свою "новую" инфу в xml(в узел под той же меткой -owerwrite), а Б не прочитал ее(т.е. отражает старую инфу), но! что важно: узел в xml Файле уже "новый"(переписан под тем же именем), т.е всего то нужно чтобы Б прокрутил свой скрипт - и этого добиваемся командой Rebuild All из меню архикада, по этой команде все объекты выполняют свой скрипт...

Даже нет необходимости обращаться к базе данных...
Я писал о том что было бы неплохо чтобы при удалении объекта была возможность выполнять некие gdl команды - блин ну как еще сказать - деструктор!

Что из того что я написал кажется не реальным?

*

SergeyAB

Re: Работа с внешними файлами из GDL объекта
« Ответ #13 : Апреля 05, 2007, 20:02:28 »
Люди!!! В принципе для себя по вопросу который задал в первом посте, я все понял, теперь вопрос более конкретный, и так уж получилось более соответствующий названию темы, как ее пере-сформулировал GAG...

кто-нибудь писал gdl объекты использующие аддон  GDL XML IN/OUT?

у меня такая трабла, пишу(основной скрипт):

ch= OPEN (`;XML`;,`;er.xml`;,`;w`;)
OUTPUT ch,"CreateDocument","",`;ddd`;
INPUT (ch,"GetLastError",ignored,s1,s2)
print s1,s2
print ch
close ch

1-я строка - создаю файл er.xml, флаг `;w`;-если  файл существует переписываем его.
2-я создаем xml документ связанный с файлом по каналу ch,
3-я считываем результат выполнения последней операции - код ошибки(S1)  и текст пояснений к ошибке (s2)
4,5,6 - наблюдаем результаты
7 закрываем связь с файлом

проблемы: вылетаю с ошибкой - создание документа xml не разрешено(код -21 вроде)..., однако файл создается, а вот документ нет...открываю в браузере написано следующее: у xml документа должен быть документ более высокого уровня...(оч. близко к тексту)
экспериментировал с другими командами приведенными в мануале по XML IN/OUT,
пробовал читать существующий xml док(перед этим смотрел его браузером - в доке все нормально), постоянно ошибки...

может кто-нить привести рабочий пример включающий:
1.Создание xml-файла,
2.Создание 2 узлов 1-го уровня, ну и 2-х  - 3-х - уровневых поддеревьев от этих 2 узлов, имена узлов любые
3.Получение позиции указателя для создания нового узла i-го уровня
4.Поиск узла k-го уровня с именем str1, и как организовать работу(условный блок операторов выполняемых с каждым найденным узлом), если таких узлов окажется более одного.

Заранее благодарю за любую помощь...может есть какой мануал по этому аддону, более полный чем тот что в справке по гдл?


*

Оффлайн ALAKK

  • *****
  • 625
  • Репутация: +55/-7
  • Пол: Мужской
  • Он спорил с модером...
Re: Работа с внешними файлами из GDL объекта
« Ответ #14 : Апреля 06, 2007, 09:45:03 »
Логика в первом посте есть, только практического применения, как ты и сам заметил (в том виде, как изложено), это иметь не будет. Но пораскинуть мозгами над развитием идеи можно.
А у тебя установлен LibPartMaker? У меня для 8.1 и я его подмел с ГС. Он с чем-то встал параллельно как часть, похоже, Distribution Kit.
Может в этом причина? C форматом  XML не разбирался. А вообще есть форум XMLщиков. сходи туда. Сам не найдешь - покопаюсь в архиве - подскажу. Мне помнится прямая дорога была на FoxForum.

 

Похожие темы

  Тема / Автор