| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Глюк автокада при построении линий командами сценария

Глюк автокада при построении линий командами сценария

Ответ
Поиск в этой теме
Непрочитано 02.11.2016, 19:24 #1
Глюк автокада при построении линий командами сценария
pwn
 
Регистрация: 02.11.2016
Сообщений: 6

Добрый день!

Сразу оговорюсь - в автокаде я практически нуль (но не нуль в программировании), посему прошу сильно не пинать Пришла ко мне как-то жена и поставила задачу нарисовать ей выкройку юбки в автокаде. Выкройка простая, пара дуг да равномерная разбивка отрезками на сегменты. Как сие делать в автокаде было непонятно, кроме того параметры выкройки могли динамически меняться (радиусы дуг, шаг разбивки и т.п.), поэтому долго и нудно строить функциями интерфейса самого автокада такое не вариант, да и от автокада по сути требовалась лишь визуализация того что получилось и потом вывод на плоттер. К счастью (о чем я хорошо помнил) у автокада есть возможность писать свои скрипты и строить все командами, и что требовалось мне это знать синтаксис команд построения дуги и отрезка и потом сгенерить и в *.SCR скрипте выдать серию команд на построение. Был на PERL по быстрому написан скриптик (почему именно на PERL а не на автокадовском лиспе - потому как а) я его знаю б) лисп в сравнении это недоязык писать на котором сродни мазохизму и поэтому курить автокадовский лисп очень не хотелось) который создал сценарий out.scr со списком команд. Далее просто, открываем 2004-й автокад, создаем новый файл (все по дефолту, ставил автокад только ради визуализации того что получилось), выбираем меню "инструменты" далее "запустить сценарий" и автокад рисует что и хотелось. Вот только одно но - часть линий рисует правильно а часть совсем по непонятным координатам, хотя все задано правильно и ошибки никакой нет. (скрин 1.jpg) Долго я мучился и не мог понять, почему он выводит криво то что задано прямо, пробовал даже ради этого 2010 автокад ставить (более свежих версий в наличии нет), глючит по разному, но все равно глючит и линии рисует неправильно. После долгих шаманских плясок чисто случайно было выяснено, что поведение что 2004 что 2010-го автокада при выводе линий командами зависит от масштаба экрана. Далее чтобы его "воспитать" на криво выведенном чертеже растягиваем масштаб так чтобы не было видно концов линий (скрин 2.jpg), жмем Ctrl-A,Del (то бишь стираем все криво выведенное),заново запускаем выполнение того же сценария и вуаля, все строится как надо (скрин 3.jpg) То есть, если автокад выполняет сценарий и еще и в динамике отображает что он делает, то будут глюки, если масштаб растянут так что процесс построения остается "за кадром" - все работает правильно. Я в первый раз в жизни сталкиваюсь с таким явлением, как разная работа одного и того же сценария в какой нить среде так чтобы она глючила если за ней "подглядывают" Хотя кто знает, я программер а не гуру автокада и может быть что-то делаю не так...

Скрины и сам сценарий лежат в этом архиве BUG.ZIP

Просмотров: 3390
 
Непрочитано 02.11.2016, 22:45
1 | #2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,749


Без анализа скрипта: добро пожаловать в тесные ряды наступивших на грабли
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.11.2016, 06:46
1 | #3
trir


 
Регистрация: 18.12.2010
Сообщений: 3,460


классика, привязку надо отключать!

Цитата:
лисп в сравнении это недоязык писать на котором сродни мазохизму
экий вы дремучий и не модный
trir вне форума  
 
Непрочитано 03.11.2016, 07:47
1 | #4
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,773


В начале скрипта поставь это:

(setvar "osmode" 0)
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Автор темы   Непрочитано 03.11.2016, 10:06
#5
pwn


 
Регистрация: 02.11.2016
Сообщений: 6


Цитата:
Сообщение от Krieger Посмотреть сообщение
В начале скрипта поставь это:

(setvar "osmode" 0)
Спасибо помогло

А про "моду" не надо втирать программеру который и так более склонен к функциональному программированию нежели ООП (хотя и владеет и тем и этим)

Повторюсь, я далеко не гуру автокада, и нужен он мне сто лет в обед, если бы жене не приспичило, я бы еще сто лет в него не лез Я больше делюсь впечатлением и офигеваю: Это до какой степени идиотизма нужно дойти разработчику сего софта, чтобы задать по дефолту какую нить системную переменную (так понимаю именно ее мы в 0 и сбрасываем а не в то что там в ней по старту када стояло), чтобы от этого поведение системы было непредсказуемым и как оказалось зависело от масштаба чертежа на экране... И наоборот, какая польза тогда от этой osmode (ежели она и режим который она включает для чего-то были введены) если она при одном масштабе работает а при другом ведет себя так как если бы я и сбросил ее в 0? Это что-то новое в программинге/математике, когда результат вывода на экран зависит от самого экрана...
pwn вне форума  
 
Непрочитано 03.11.2016, 13:09
#6
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,773


OSMODE http://forum.dwg.ru/showthread.php?p=697924

Эта системная переменная отвечает за привязки. Привязки работают в пределе некоторой области возле курсора (процент от экрана), поэтому результат зависит от масштаба экрана.
При использовании командных методов, если рядом с указанной точкой находится объект к которому можно привязаться, к нему и привяжется. Если использовать другие способы создания примитивов entmake или vla-add..., то привязки не мешают.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 03.11.2016, 13:34
#7
trir


 
Регистрация: 18.12.2010
Сообщений: 3,460


А когда ручками рисуешь - привязки очень радуют. Просто command - эмулирует пользовательский ввод
trir вне форума  
 
Автор темы   Непрочитано 03.11.2016, 15:10
| 1 #8
pwn


 
Регистрация: 02.11.2016
Сообщений: 6


Цитата:
Сообщение от trir Посмотреть сообщение
А когда ручками рисуешь - привязки очень радуют. Просто command - эмулирует пользовательский ввод
Я ничего не имею против того чтобы привязки кого-то радовали. И пусть command эмулирует ввод, какая разница? Я в команде что передаю? АБСОЛЮТНЫЕ координаты отрезка. X1 Y1 X2 Y2
То есть, выходит, что при включенной привязке даже если я задам отрезок скажем 0,0,100,100 он мне его нарисует только при условии если ничего рядом нету? А будет еще рядом что-то то привяжется и фигню нарисует, что ему взбрендило а не что в команде? Медвежья услуга а не помощь, нафиг такой не надо. За такое пристрелить хочется, аналогично автовводу в некоторых приложениях, например на сотовых телефонах режим T9

Мое программерское ИМХО: Было бы у ваятелей сего када чточку более мозгов то

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

И никаких граблей... вот кто только бы до них сие довел.... я целый день! убил пытаясь понять что же это за хрень, я ли ошибся в своем скрипте или что еще не так, гуглу моцк взорвал, но гугл ведь знает ответ лишь на правильно поставленный вопрос, а тут еще нужно суметь его сформулировать... Качал 2010 кад, который мне нафиг не убился, потом ставил, теперь его сносить еще предстоит. Куча абсолютно не нужных движений только из за этой дурацкой привязки. Не, ну я понимаю, я программер а не автокадщик, и жду от системы простой и предсказуемой реакции - синтаксис соблюден? да. Ошибок нет? Нет. Значит результат должен быть однозначный. Иначе это не функциональный программинг (в который меня тут тыкали защитники лиспа) а еще хуже чем самый махровый ООП...
pwn вне форума  
 
Непрочитано 03.11.2016, 16:08
#9
trir


 
Регистрация: 18.12.2010
Сообщений: 3,460


Смешные у вас предъявы. Вам же сказали - используйте entmake. А есть ещё COM и NET API, ObjectARX.
Правильные поцонны command не используют
trir вне форума  
 
Непрочитано 04.11.2016, 18:23
#10
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,773


Могу ошибаться, но возможно, в стандартные команды автокада передаются именно те координаты, которые указал пользователь курсором или же вбил в ручную. А далее, уже внутри этой команды, в зависимости от переменной osmode ищутся ближайшие к этой точке установленные привязки. Поэтому, даже если я передаю по факту конкретные координаты, команда все равно обработает привязки. Поэтому тут "глючет" даже не конкретно функция command, а сами команды када, типа line. Так уж они устроены для удобства ручного черчения.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 05.11.2016, 01:10
#11
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,274
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Krieger Посмотреть сообщение
Могу ошибаться
Можешь, но не сильно.

----- добавлено через ~11 ч. -----
Цитата:
Сообщение от pwn Посмотреть сообщение
Мое программерское ИМХО: Было бы у ваятелей сего када чточку более мозгов то

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

Управление приоритетом ввода координат в командную строку над текущими режимами привязки.
(системная переменная OSNAPCOORD)
Согласно привязке
Корректировка введенных с клавиатуры значений координат с учетом текущих режимов объектной привязки. (системная переменная OSNAPCOORD = 0)
С клавиатуры
Использование координат, введенных с клавиатуры (без применения к ним объектной привязки). (системная переменная OSNAPCOORD = 1)
С клавиатуры (кроме пакетов)
Использование координат, введенных с клавиатуры (без применения к ним объектной привязки) во всех случаях, кроме выполнения пакетных файлов. (системная переменная OSNAPCOORD = 2)
----- добавлено через ~11 ч. -----
Цитата:
Сообщение от pwn Посмотреть сообщение
в) при запуске скриптов игнорировать привязки, даже если заданы, ибо будет всегда непредсказуемый результат...
В большинстве случаев тот, кто пишет скрипт, хочет чтобы результат был точно такой, как будто он вручную вводил данные.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 05.11.2016, 11:48
#12
pwn


 
Регистрация: 02.11.2016
Сообщений: 6


Цитата:
Сообщение от Krieger Посмотреть сообщение
Поэтому тут "глючет" даже не конкретно функция command, а сами команды када, типа line.
Я сильно подозреваю, что это все же трюк не самих функций что-либо полезное выводящих а их лисповой обертки и в частности command. Та же entmake что использует для построения? Сама линии рисует или все же функцию line использует? Или думаете для вызова command-line и entmake-line будет задействован разный код построения? Я вызываю command, он глотает в том числе и координаты далее умничает и пытается их к чему-то привязать и потом сливает на вход line то что ему взбрендило. Либо возможен другой вариант, если привязываются сами функции - entmake и ей подобные передают на вход line и т.п. функций скрытый параметр, сбрасывающий отработку привязок. Мне же от када по сути нужен только интерфейс к голым командам построения и нафиг не убилась их "своеобразная" лисповая обертка как и сам лисп в придачу. Мне вот тут для этого предлагали COM и NET API да ObjectARX поюзать. Можно конечно же, убить Х дней и раскурить, и работать будет кудаж сему деваться, но нафига скажите тратить жисть на всякую фигню когда есть простой текстовый интерфейс?
Цитата:
Так уж они устроены для удобства ручного черчения.
Вот вот вот, о чем я и говорил, что если уж низя никак по дефолту держать этот осмод в нуле со старта, то хватило бы мозгов его занулять хотя бы на этапе выполнения скрипта или лиспового приложения (что для моего сценария по сути одно и то же), ибо куча команд из пакетного файла это далеко не ручное черчение. Повторюсь, я далеко не гуру автокада и может быть он в основном для ручного черчения и создан, но попробуйте вы вручную замутить нечто похожее на это
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 39
Размер:	248.2 Кб
ID:	178744
По нескольким начальным параметрам, и потом динамически все перестраивать ели что-то поменялось. Простая разбивка на PERL-е делается за 10 минут, то что далее последовало (а делалось все ессно не ради простой разбивки) уже чуть подольше ибо там сначала уравнения нада порешать чтобы понять как координаты искать, ну пусть полдня еще, итого получился маленький скриптик в 256 строчек (и это я еще не выкидывал отладочный код) из которых половина комментарии. И все просто наглядно и прекрасно читается (прочтет даже тот кто перлом не владеет, а знает хотя бы бейсик). Господа любители лиспа-миллион-скобок могут попробовать на спор в такие же сроки и в такой же объем кода сваять что либо аналогичное А потом уже могут смело кого-то вахлаком обзывать....

----- добавлено через ~6 ч. -----
Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
В большинстве случаев тот, кто пишет скрипт, хочет чтобы результат был точно такой, как будто он вручную вводил данные.
С трудом представляю когда и для чего сие нужно. Если один какой нить примитив обработать да и еще чтоб на курсор сие отзывалось еще может быть, но когда этого добра зоопарк да и все еще от масштаба экрана зависит... хаос же будет и никаким контролем внутри скрипта не поймать что же реально получилось... Не, ну калейдоскоп тоже полезная и красивая игрушка, он тоже из рандома красоту извлекает только пользы практической с того...

Последний раз редактировалось pwn, 05.11.2016 в 17:40.
pwn вне форума  
 
Непрочитано 05.11.2016, 18:23
1 | #13
trir


 
Регистрация: 18.12.2010
Сообщений: 3,460


Цитата:
Я сильно подозреваю, что это все же трюк не самих функций что-либо полезное выводящих а их лисповой обертки и в частности command. Та же entmake что использует для построения? Сама линии рисует или все же функцию line использует? Или думаете для вызова command-line и entmake-line будет задействован разный код построения? Я вызываю command, он глотает в том числе и координаты далее умничает и пытается их к чему-то привязать и потом сливает на вход line то что ему взбрендило.
Ещё раз повторяю, command эмулирует работу через GUI - AutoCAD не знает, что это код, для него это команды пользователя через GUI

Цитата:
Либо возможен другой вариант, если привязываются сами функции - entmake и ей подобные передают на вход line и т.п. функций скрытый параметр, сбрасывающий отработку привязок.
неа, entmake создаёт список - в Лиспе всё списки

Цитата:
может быть он в основном для ручного черчения и создан,
А зачем GUI по твоему делают?

Цитата:
Мне же от када по сути нужен только интерфейс к голым командам построения и нафиг не убилась их "своеобразная" лисповая обертка как и сам лисп в придачу.
так тебе и AutoCAD не нужен - делай dxf и никаких проблем

Последний раз редактировалось trir, 05.11.2016 в 18:34.
trir вне форума  
 
Автор темы   Непрочитано 05.11.2016, 21:32
#14
pwn


 
Регистрация: 02.11.2016
Сообщений: 6


Цитата:
Сообщение от trir Посмотреть сообщение
Ещё раз повторяю, command эмулирует работу через GUI - AutoCAD не знает, что это код, для него это команды пользователя через GUI
Фиг с ним с командом, я юзал первое что по примерам в инетре нагуглилось. Были бы примеры на entmake были бы то на нем бы наваял мне было без разницы чем до функций построения добраться. Еще бы там те гуру которые народ учат кадовским лиспом пользоваться везде бы про сброс привязок и какой командой глаголили бы, то и граблей бы не было. А то фиг с ним я наступил, так нет же тут выше говорилось про тесные-стройные ряды на сии грабельки ступивших. Я то не один такой оказывается
Цитата:
неа, entmake создаёт список - в Лиспе всё списки
Список и что? Какая нафиг разница? У перла тоже все можно списками делать. Хотите себя почувствовать как в лиспе? Пихайте все данные в массивы да суйте побольше скобок, благо перлу сие пофиг просто отсеет лишнее и все. Но если вы мазохист он не будет вам этом мешать - язык сей могучий и гибкий, и никому ничего не навязывает. Вы пришли с бейсика? Нет проблем - можно писать очень похоже на бейсик. С си? Тоже самое. И даже половые извращения лиспа в нем вполне поместятся. Только какое это отношение имеет к "железной" функции line которая сама к тому же (как и кад) на си писана, и будет работать именно по тем координатам которые попали ей на вход? И как ей их передали, списком али ссылкой на список али тупо скалярами, да какая ей разница то? Если привязку делает она сама (что очень врят ли, ибо код привязки множить по куче функций придется) то тогда доп параметр влияющий на поведение который суть просто еще один параметр переданный неявно...
Цитата:
А зачем GUI по твоему делают?
Чтобы был интерфейс удобный для тех кто от программинга далек и кого командная строка приводит в ужас. Ну и для того, что ряд вещей действительно удобнее делать через GUI, но так бывает далеко не со всем и не всегда. В моем представлении правильная GUI кад-система эта та что предоставляет интерфейс, но по результатам работы пользователя в нем генерит список команд в виде текста и потом его и сохраняет. И тогда надо GUI - юзаем GUI. А приспичило - лезем в код и правим что надо. Можно тогда и спецформат не создавать типа DXF
Цитата:
так тебе и AutoCAD не нужен - делай dxf и никаких проблем
Спасибо за наводку, мне не пришло в голову сразу полезть на CPAN да поискать модуль. Скачаю поставлю да попробую с ним, тем паче что делов на 10 минут. Отпишусь потом что получилось....
pwn вне форума  
 
Непрочитано 05.11.2016, 23:17
#15
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,773


Цитата:
Сообщение от pwn Посмотреть сообщение
Я сильно подозреваю, что это все же трюк не самих функций что-либо полезное выводящих а их лисповой обертки и в частности command. Та же entmake что использует для построения? Сама линии рисует или все же функцию line использует? Или думаете для вызова command-line и entmake-line будет задействован разный код построения?
Функция command просто эмитирует ручную работу пользователя, со всеми вытекающим, вот и все, для этого она и была задумана.
entmake же тупо напрямую прописывает dxf коды в базу чертежа, например так:
Код:
[Выделить все]
(entmake '((0 . "LINE") (10 999 555 0.0) (11 0.0 0.0 0.0)))
т.е. никаких построений нет, а соответсвенно, и привязки не нужны.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Автор темы   Непрочитано 05.11.2016, 23:37
#16
pwn


 
Регистрация: 02.11.2016
Сообщений: 6


Цитата:
Сообщение от trir Посмотреть сообщение
так тебе и AutoCAD не нужен - делай dxf и никаких проблем
Попробовал сей модуль, это не креатор а парсер DXF файлов. Его чтобы обратное научить делать (создавать DXF да туда примитивы писать) нужно напильником точить, а этим заниматься лень

Цитата:
Сообщение от Krieger Посмотреть сообщение
т.е. никаких построений нет, а соответсвенно, и привязки не нужны.
Спасибо конечно же за пояснение, но курить формат DXF чтобы понять что скормить в entmake чтоб четыре скаляра координат отрезка превратить в то что захавает DXF/entmake нет никакого желания. Если до этого дойдет, я тогда уж лучше жахну предложенный по ссылке выше парсер сделаю из него креатер и буду все делать сразу им напрямик. А пока... мне вполне хватает того что делает command отученный чудить сбросом привязок.

Спасибо всем, мне теперь более менее понятно чего хотеть от этого када и как его заставлять делать что нужно а не что ему хочется не занимаясь всякой ерундой (ибо и без того есть чем заняться).
pwn вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Глюк автокада при построении линий командами сценария

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аннотивность типов линий ArchitectV AutoCAD 16 02.11.2017 18:06
не показывает вес линий Александер AutoCAD 39 06.04.2016 16:02
При установки автокада (2009,2013) типы линий (GOST 2.303) не ставятся, а при перезагрузки все панели прячутся обратно kapityuliya AutoCAD 5 11.03.2014 09:52
Некорректный экспорт в ПДФ. Вывод несуществующих линий из автокада iollo AutoCAD 14 28.02.2014 12:03
Печать со скрытием линий вызывает ошибку Autocad-приложения и его закрытие. BM60 AutoCAD 7 27.04.2009 20:10