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

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

Автопостроение линии поверх указанной, но длинее на заданную величину

Ответ
Поиск в этой теме
Непрочитано 31.01.2017, 21:31 #1
Автопостроение линии поверх указанной, но длинее на заданную величину
dozZzer
 
Регистрация: 31.01.2017
Сообщений: 10

Всем привет!
Заранее прошу не пинать, я тут недавно
Вроде бы простая задача, но не нашел по поиску.
В общем имеем 2D линии или полилинии, прямогольники, и хотелось бы такой скрипт, чтобы при клике по линии или стороне прямоугольника поверх нее отрисовывавалсь линия с теми же свойствами выбранного объекта, но длиннее на 1.5" c каждой стороны, т.е. привязка центр-центр и вдоль.
В моём случае это нужно дла разбивки воздуховодов и показа, что это фланцевое соединение (TDC). Может еще какое применение можно придумать.
Величину удлинения можно пока сделать фиксированной.
Кто бы смог такой скрипт написать?
Заранее спасибо за помощь и с меня +
Просмотров: 8552
 
Непрочитано 31.01.2017, 23:23
#2
Кулик Алексей aka kpblc
Moderator

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


На каком языке пишем?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.02.2017, 06:14
#3
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


1. Язык программирования, Ось, Программа под которую собираетесь писать. А то вдруг окажется, что это С++, Линукс и LiberCAD или ZCAD + pascal...
2. Что Вы уже сделали и что у Вас не получается сделать?
Boxa вне форума  
 
Автор темы   Непрочитано 01.02.2017, 16:15
#4
dozZzer


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


ACAD 2016, Windows 10 64-bit. Наверно такой скрипт на Лиспе надо писать, я даже не знаю как проще, поэтому прошу помощи. Но на ЛИСП никогда не писал
Еще раз спасибо!
dozZzer вне форума  
 
Непрочитано 01.02.2017, 16:58
#5
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Отчего же сразу на Лисп, можно и другие языки использовать. На .NET, для примера, Вашу задачу в несколько строчек можно решить...
Собственно, а на каком языке Вы когда-то писали?
Boxa вне форума  
 
Автор темы   Непрочитано 01.02.2017, 18:29
#6
dozZzer


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


Ой давно это было, на турбо Паскале Если Вам не трудно, сделайте одолжение, напишите! Буду премного благодарен!
.NET вообще не представляю что и как)) ЛИСП думал хоть текстовик, можно поковырять что-то самому поэкспериментировать потом
dozZzer вне форума  
 
Непрочитано 02.02.2017, 08:35
#7
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от dozZzer Посмотреть сообщение
Если Вам не трудно, сделайте одолжение, напишите!
Этого делать не буду. Могу подсказать и направить, в рамках данного раздела форума. Делать работу за Вас, это в поиск исполнителей.
В рамках раздела Программирование, могу помочь Вам вспомнить то, чему Вас учили для того, что бы Вы сами написали нужное Вам ПО.

Итак Паскаль.
Наиболее простой для Вас путь, это VBA. т.к. он из той же парадигмы языков, что и Паскаль.
По сути, Вам нужно:
- установить себе VBA Enabler,
- запустить его Alt+F11 (команда _vbaide),
- открыть справку (она тут: C:\Program Files\Common Files\Autodesk Shared\ACADAUTO.CHM) и
- собрать программу из нескольких примеров.

Алгоритм примерно такой:
1 - выбрать объект ThisDrawing.Utility.GetEntity (Или выбор множества объектов SelectionSet)
--- Получить от выбранного объекта: Длину (Length), угол поворота относительно осиХ (Angle), стартовую точку (StartPoint).
2 - создать новую линию
--- ThisDrawing.ModelSpace.AddLine(StartPoint1, EndPoint1), где : StartPoint1 - точка с координатами (-1.5",0,0); EndPoint1 - точка с координатами (Length+1.5",0,0)
3 - повернуть объект относительно базовой точки, метод acadLine.Rotate BasePoint, RotationAngle; где BasePoint - точка (0,0,0), а угол поворота Angle из п.1
4 - переместить объект, метод acadLine.Move Point1, Point2; где Point1 - (0,0,0) , Point2 - StartPoint из п.1

Собственно все.
Где в этом алгоритме можно налажать не представляю, но если будет не получаться, спрашивайте.
Boxa вне форума  
 
Непрочитано 02.02.2017, 09:53
#8
Владимир_М


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Алгоритм примерно такой:
Помойму, если пп. 2 и 3 делать сразу в точке полученной в п. 1, то можно обойтись без п. 4
Владимир_М вне форума  
 
Непрочитано 02.02.2017, 10:16
#9
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Владимир_М Посмотреть сообщение
Помойму, если пп. 2 и 3 делать сразу в точке полученной в п. 1, то можно обойтись без п. 4
можно, но так нагляднее пояснить построение линии, откуда какие данные берутся и для чего.

Понятно, что для себя я написал бы что-то типа:
Код:
[Выделить все]
  Db.Line acLine = new Db.Line(new Gem.Point3d(line.StartPoint.X -1.5, line.StartPoint.Y, line.StartPoint.Z),
 new Gem.Point3d(line.StartPoint.X + 1.5 + line.Length, line.StartPoint.Y, line.StartPoint.Z));
acLine.TransformBy(Gem.Matrix3d.Rotation(line.Angle, ed.CurrentUserCoordinateSystem.CoordinateSystem3d.Zaxis, line.StartPoint));
ЗЫ.
Вспомнил про видеокурс по VBA: http://adn-cis.org/forum/index.php?topic=7270.0

Последний раз редактировалось Boxa, 02.02.2017 в 11:51. Причина: ссылку добавил
Boxa вне форума  
 
Непрочитано 02.02.2017, 12:50
#10
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


С помощью команд "Копировать" и "Увеличить"
Код:
[Выделить все]
(defun C:D15 ()
(vl-load-com)
(setvar "CMDECHO" 1)
(vl-cmdf "_COPY" "_Single" pause "" "0,0,0")
(vl-cmdf "_lengthen" "_Delta" 1.5 (list(entlast)(vlax-curve-getStartPoint(entlast)))(list (entlast)(vlax-curve-getEndPoint(entlast))) "")
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 02.02.2017, 14:22
#11
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от VVA Посмотреть сообщение
С помощью команд "Копировать" и "Увеличить"
VVA, Вам то зачем нужно это самоутверждение, а у автора был шанс научиться чему-то, но Вы ему помогли. Медвежья услуга.
Boxa вне форума  
 
Непрочитано 02.02.2017, 15:18
#12
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Всё, теперь кранты.
Profan вне форума  
 
Непрочитано 02.02.2017, 15:51
#13
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Boxa
>>Алгоритм примерно такой:
>>Где в этом алгоритме можно налажать не представляю, но если будет не получаться, спрашивайте.
Однако налажать получилось. Агоритм не соответствует тому что описано в стартовом посте.

Кроме того все делается через зад. Какие нафиг углы переносы и повороты? Так чтоб прогрузить ядрышки и забить мегабайты?
zamtmn вне форума  
 
Непрочитано 02.02.2017, 16:51
#14
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Однако налажать получилось. Агоритм не соответствует тому что описано в стартовом посте.
Как скажите...

или Вы про работу с прямоугольниками? То до них еще не добрались, начали с малого.
Цитата:
Сообщение от zamtmn Посмотреть сообщение
Кроме того все делается через зад. Какие нафиг углы переносы и повороты?
С удовольствием прочитаю описания более простого и понятного для новичка метода. Я старался описывать практически "ручной" подход, т.к. считаю, что это максимально понятно. Возможно ошибаюсь и у Вас есть более лучшее решение. Без подколок, действительно интересно.
Цитата:
Сообщение от zamtmn Посмотреть сообщение
Так чтоб прогрузить ядрышки и забить мегабайты?
Проехать из города в город на мерседесе сможет и новичок, но только профессионал сможет это сделать на старом, ржавом и убитом ведре. Намек понятен?
Boxa вне форума  
 
Непрочитано 02.02.2017, 17:29
#15
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>Как скажите...
я про алгоритм из #7 там явно нехватает шагов, т.к. повернутая линия длиной 3" переносится на исходную линию. невижу в каком пункте она стала длинее исходной на 1.5" с каждой стороны.

>>Я старался описывать практически "ручной" подход, т.к. считаю, что это максимально понятно
"Понятно" кончается в #9 - матрицы, трансформации... Это самые страшные для новичка вещи))

>>С удовольствием прочитаю описания более простого и понятного для новичка метода.
голая арифметика. P1 и P2 - точки исходной линии
dP=P2-P1 //линия в виде "вектора"
L=1.5*нормализованя(dP)=1.5*(dP/length(dP)) //получаем вектор длиной 1.5 в "направлении" линии
P1=P1-L // новая точка начала
P2=P2+L // новая точка конца

>>Проехать из города в город на мерседесе...Намек понятен?
Образ абсолютно неправильный. Дело не в ведре.
Я предлагаю ехать оптимальным путем, вы едете по пути который знаете. Я проеду 1км, вы 500.
В данном случае ваше решение будет даже не в разы хуже, а на порядки

----- добавлено через ~3 мин. -----
>>точка с координатами (Length+1.5",0,0)
Извиняюсь, претензия снимается

Последний раз редактировалось zamtmn, 03.02.2017 в 12:57.
zamtmn вне форума  
 
Непрочитано 02.02.2017, 19:03
#16
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от zamtmn Посмотреть сообщение
"Понятно" кончается в #9 - матрицы, трансформации... Это самые страшные для новичка вещи))
Теперь внимательно читаем #9
Цитата:
Сообщение от Boxa Посмотреть сообщение
Понятно, что для себя я написал бы что-то типа:
т.е. не предлагал новичку писать на С# и пользоваться матрицами и трансформациями.
Но вот в Вашем предложение операции над векторами для новичка самое то, Вы привыкли к питону, но в VBA с этим все намного печальнее. Попробуйте написать Ваш алгоритм на vba и посмотрите насколько он будет проще.

Цитата:
Сообщение от zamtmn Посмотреть сообщение
Образ абсолютно неправильный. Дело не в ведре.
Я предлагаю ехать оптимальным путем, вы едете по пути который знаете. Я проеду 1км, вы 500.
В данном случае ваше решение будет даже не в разы хуже, а на порядки
Вы предлагаете в первом классе, на уроках арифметики изучать матрицы...

Последний раз редактировалось Boxa, 02.02.2017 в 19:12.
Boxa вне форума  
 
Непрочитано 02.02.2017, 19:17
#17
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>Попробуйте написать Ваш алгоритм на vba и посмотрите насколько он будет проще.
У меня не алгоритм, у меня несколько арифметических действий дающих нужный результат. VBA я ниразу в жизни не видел - хотите сказать что там нет арифметики для флоатов?
>>По поводу векторов, Вы привыкли к питону, но в VBA с этим все намного печальнее. Попробуйте написать Ваш алгоритм на vba и посмотрите насколько он будет проще.
Я привык к паскалю.
dP=P2-P1
и
dPx=P2x-P1x
dPy=P2y-P1y
dPz=P2z-P1z
вобщемто одно и тоже если я правильно понимаю о чем вы.

>>Вы предлагаете в первом классе, на уроках арифметики изучать матрицы...
)) ниче не предлагаю. Среднестатистический человек гораздо проще поймет вектора на пальцах, чем матрицы поворота, да еще и не вокруг 0,0,0 и трансформацию векторов этими матрицами
Вы в курсе что сидит внутри Gem.Matrix3d.Rotation(line.Angle, ed.CurrentUserCoordinateSystem.CoordinateSystem3d.Zaxis, line.StartPoint)?

>>3 - повернуть объект относительно базовой точки, метод acadLine.Rotate
>>4 - переместить объект, метод acadLine.Move
это тоже самое, другими словами. Такой подход к вычислениям очень ресурсоемкий
zamtmn вне форума  
 
Непрочитано 02.02.2017, 19:30
#18
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Ещё раз.я не предлагал никому разбираться с матрицами поворота.я предложил максимально понятный, ручной алгоритм в сообщение #7. Зачем Вы искажает мои слова?
Среднестатистическому пользователю автокада более понятны шаги: создать линию нужной длины, повернуть линию и передвинуть линию.

Я Вас понял. У нас несколько разный подход к простоте, к сожалению мои коллеги мат аппаратом не пользуются и им проще объяснить именно так как я сделал. Видимо окружение накладывает свой отпечаток. Спорить не о чем

Последний раз редактировалось Boxa, 02.02.2017 в 19:38.
Boxa вне форума  
 
Непрочитано 02.02.2017, 19:38
#19
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Вы предлагали взять линию, повернуть, перенести... Мы та знаем что там внутри этих операций скрыто
>>Какие нафиг углы переносы и повороты? Так чтоб прогрузить ядрышки и забить мегабайты?
Я придираюсь к оптимальности по вычислительной нагрузке. Вместо нескольких элементарных операций предлагается в космос слетать. Еще и в безапелляционной манере, типа проще не бывает. бывает.
zamtmn вне форума  
 
Непрочитано 02.02.2017, 20:09
#20
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Еще и в безапелляционной манере, типа проще не бывает
Цитату пожалуйста. (#18 сообщение не приводить, т.к. оно в части понятности лишь дубляж #14).

Цитата:
Сообщение от zamtmn Посмотреть сообщение
Я придираюсь к оптимальности по вычислительной нагрузке.
Я и не оспариваю, что чистая математика менее ресурсоемка, где я такое писал? Метафора про машины, была про то, что новичку , с моей точки зрения, проще подход автокадчика и на начальных этапах освоения программирования можно о ресурсах не думать. Всему свое время.
Boxa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Автопостроение линии поверх указанной, но длинее на заданную величину

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли назначить красные линии, имея только КПТ? Modis Прочее. Архитектура и строительство 13 15.09.2016 08:55
Autocad 2010. При наложении линии поверх другой, очертание линий не видно. abcdlv AutoCAD 13 02.11.2012 12:56
Толщина засечки размерной линии на строительных чертежах Hooliganka Поиск литературы, чертежей, моделей и прочих материалов 51 01.06.2012 07:27
Как сгладить 2 линии. Или как сгладить только часть линии. Димас AutoCAD 3 14.03.2006 08:28