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

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

Знатоки Lisp, помогите найти середину сегмента сплайна.

Ответ
Поиск в этой теме
Непрочитано 27.11.2018, 02:40 #1
Знатоки Lisp, помогите найти середину сегмента сплайна.
iskatel111
 
Регистрация: 13.06.2012
Сообщений: 98

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

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

{ниже это сюда}
точки на чертеже вобщемто не точки, а некоторая несуразность в виде штриховки (как маленький круг) и надписи Мтекст рядом. думаю пробежаться и вручную преобразовать это в блоки, с точкой вставки в центре "круга". задача - получить эту самую точку, по которой ориентироваться. Ориентироваться и привязками, и программно находить имя по тексту, и по координатам находить имя (может кто подскажет как лучше). Если тупо сравнивать координаты - прокатит? не подложит свинью точность double?

Другая задача, что я на vba (ну не совсем vba, шарп через interop, но все что мне доступно - тоже что и в vba) могу лисп вызывать через SendCommand, но данные как лучше передавать? встраивать в строку комманды, или сохранить гдето в чертеже? ну собственно как результат получать потом?

ЗЫ второй вариант - пересчитать сплайн в своей программе, но гугл мне штук шесть вариантов сплайна показал, без конкретных формул, и хз какая в акаде используется. Если кто знает киньте плиз конкретной формулой.
Просмотров: 6719
 
Непрочитано 27.11.2018, 07:50
#2
trir


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


Цитата:
ну не совсем vba, шарп через interop
нафига страдать фигнёй?
cur.GetPointAtParameter((cur.EndParam+cur.StartParam)/2)
cur.GetPointAtDist()
cur.GetParameterAtPoint()

1. Находим параметры точек
2. Находим растояние до точек
3. Находим точку по среднему растоянию

Последний раз редактировалось trir, 27.11.2018 в 07:57.
trir вне форума  
 
Автор темы   Непрочитано 28.11.2018, 15:43
#3
iskatel111


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


Цитата:
Сообщение от trir Посмотреть сообщение
нафига страдать фигнёй?
cur.GetPointAtParameter((cur.EndParam+cur.StartParam)/2)
cur.GetPointAtDist()
cur.GetParameterAtPoint()
Откуда это все? у меня только такие варианты для сплайна по "get" (во вложении)

Я обращаюсь к акаду как к СОМ объекту, а не дополнение на SDK пишу...
Миниатюры
Нажмите на изображение для увеличения
Название: Untitled-1 copy.png
Просмотров: 124
Размер:	7.1 Кб
ID:	208512  
iskatel111 вне форума  
 
Непрочитано 28.11.2018, 16:11
#4
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от iskatel111 Посмотреть сообщение
Откуда это все?
из .Net, вестимо) Не все в COM-модель вытащено.
Сергей812 вне форума  
 
Автор темы   Непрочитано 28.11.2018, 16:15
#5
iskatel111


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
из .Net, вестимо) Не все в COM-модель вытащено.
Ну а поподробней? Куда копать, чтоб быстрый старт... Я кроме как СОМ не пользовался, а сделать эту штуку очень хотелось бы.
iskatel111 вне форума  
 
Непрочитано 28.11.2018, 16:18
#6
Кулик Алексей aka kpblc
Moderator

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


См. в сторону функций vlax-curve-*. Только учитывай их тонкости и параметры (добро пожаловать в справку)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.11.2018, 16:23
#7
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Официальная справка
Русскоязычный официальный сайт разработчиков
а для разгона
Один из первых русскоязычных источников от Бушмана Андрея
ну и инет в целом. Например, есть блоги программистов Аутодеска, где тоже можно достаточно много интересного найти в виде живых примеров.
Сергей812 вне форума  
 
Автор темы   Непрочитано 28.11.2018, 16:26
#8
iskatel111


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


Ясн, понятно, как обычно на вопрос "сколько времени" ссылки на теорию и инструкцию изготовления часов

Непросто найти точку на сплайне...
iskatel111 вне форума  
 
Непрочитано 28.11.2018, 16:42
#9
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


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

Есть и на лиспе по первой ссылке из 7-ого поста.
Сергей812 вне форума  
 
Автор темы   Непрочитано 28.11.2018, 17:02
#10
iskatel111


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Если полезли в программирование - будьте готовы перелопачивать сотни страниц, постепенно выходя на нужные фрагменты кода или идеи, как их реализовать) Программирование - ресурсоёмкий процесс достаточно.
Я это понимаю, но вопрос что в топике, всеголишь маленький кусок задачи, с автокадом вобщемто мало связанной - в автокаде нужно сделать лишь пометки на готовом чертеже и напечатать ПДФ. Это вполне удачно получается и через СОМ. Но бросить все и в спешном порядке изучать ARX для того чтоб найти точку на сплайне ИМХО перебор...
iskatel111 вне форума  
 
Непрочитано 28.11.2018, 17:04
#11
Boxa

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


Цитата:
Сообщение от iskatel111 Посмотреть сообщение
Ясн, понятно, как обычно на вопрос "сколько времени" ссылки на теорию и инструкцию изготовления часов
Непросто найти точку на сплайне...
ИМХО, Вам все на блюдечке принесли....

Вот ссылка, как выделить и открыть объект: https://sites.google.com/site/bushma...ktov-v-certeze . Ссылку на этот ресурс Вам Сергей812 дал, как привести выбранный объект к типу кривая, это азы ООП, какими методами объекта кривая воспользоваться, для получения точек, Вам trir, привет. Что еще нужно то?
Причем тут теория и инструкция часов? Причем тут ARX и C++, если разговор про С#...
ИМХО, Ответы были даны максимально точные и прямые.
Boxa вне форума  
 
Непрочитано 28.11.2018, 17:05
#12
Кулик Алексей aka kpblc
Moderator

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


iskatel111, в заголовке разговор о лиспе, но ни слова не было о работе с другим документом.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.11.2018, 17:10
#13
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от iskatel111 Посмотреть сообщение
спешном порядке изучать ARX для того чтоб найти точку на сплайне ИМХО перебор
А потом еще выяснить, что .Net и ObjectARX - это не совсем одно и тоже, первое есть высокоуровневая обертка над вторым)


Цитата:
Сообщение от iskatel111 Посмотреть сообщение
маленький кусок задачи, с автокадом вобщемто мало связанной
Ну как не связано, если задача относительно примитива акада. Но что писал в посте №6 Алексей по поводу лиспа - вы просто проигнорировали.
Сергей812 вне форума  
 
Автор темы   Непрочитано 28.11.2018, 17:12
#14
iskatel111


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Ответы были даны максимально точные и прямые.
Вы просто меня переоцениваете, я кроме как с СОМ не работал, и даж не знаю куда эти ответы применить. Образно понимаю что надо сдк скачать, но вобщем темный лес это для меня.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
iskatel111, в заголовке разговор о лиспе, но ни слова не было о работе с другим документом.
не совсем понял про другой документ, я с одним документом (чертежом) работаю.
ну да, на лиспе и надо, я его хоть через interop смогу вызвать.
я так понял vlax-curve-* меня спасут, только остался один вопрос - параметры то я могу передать через запрос, а результат этой функции как в программу вернуть?
iskatel111 вне форума  
 
Непрочитано 28.11.2018, 17:24
#15
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от iskatel111 Посмотреть сообщение
ну не совсем vba, шарп через interop, но все что мне доступно - тоже что и в vba)
если используете VB.Net как VB - то вы на полпути к .Net на самом деле) Можно и на VB.NET писать - если синтаксис "VBA" ближе.

Цитата:
Сообщение от iskatel111 Посмотреть сообщение
только остался один вопрос - параметры то я могу передать через запрос, а результат этой функции как в программу вернуть?
Например, через UserR.
Сергей812 вне форума  
 
Непрочитано 28.11.2018, 18:08
#16
trir


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


Цитата:
Образно понимаю что надо сдк скачать
не надо
достаточно написать одну функцию
изучить NET API проще, чем заморачиваться с lisp'ом - документации больше

Последний раз редактировалось trir, 28.11.2018 в 18:27.
trir вне форума  
 
Непрочитано 29.11.2018, 10:01
#17
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от iskatel111 Посмотреть сообщение
ну да, на лиспе и надо
на лиспе
в середине попавшего под курсор сегмента рисуется точка 3/3

Код:
[Выделить все]
 
(setq spline_object_data (entsel "\nВыберите сплайн: ")
	  spline_object (vlax-ename->vla-object (car spline_object_data))
	  spline_pick_point (vlax-curve-getclosestpointto spline_object (cadr spline_object_data))
	  spline_pick_point_distance (vlax-curve-getdistatpoint spline_object spline_pick_point)
	  vertices_list '()
)
(if (= 1 (vlax-get spline_object 'splinemethod)) (vlax-put spline_object 'splinemethod 0))
(setq fit_coordinates_list (append (vlax-get spline_object 'FitPoints) '(0 0 0 )))
(while (cdddr fit_coordinates_list)
	(setq vertices_list (append vertices_list (list (list (car fit_coordinates_list) (cadr fit_coordinates_list) 0.0)))
		  fit_coordinates_list (cdddr fit_coordinates_list)
	)
)
(setq distance_list (vl-sort (append (mapcar '(lambda (current_vertex) (vlax-curve-getdistatpoint spline_object (vlax-curve-getclosestpointto spline_object current_vertex))) vertices_list) (list spline_pick_point_distance)) '<)
	  pick_point_distance_index (vl-position spline_pick_point_distance distance_list)
)
(if (zerop pick_point_distance_index)
	(setq index_afore 0
		  index_after 1
	)
	(setq index_afore (1- pick_point_distance_index)
		  index_after (1+ pick_point_distance_index)
	)
)
(setq mid_segment_point (vlax-curve-getpointatdist spline_object (+ (nth index_afore distance_list) (/ (- (nth index_after distance_list) (nth index_afore distance_list)) 2.0))))
(setvar 'pdmode 3)
(setvar 'pdsize 3)
(command "_point" mid_segment_point)
koMon вне форума  
 
Непрочитано 29.11.2018, 10:13
#18
trir


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


koMon, а теперь напиши как с этим взаимодействовать из NET-кода
trir вне форума  
 
Непрочитано 29.11.2018, 10:25
#19
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


trir,
1. tc не использует .NET
2. tc нужно было на лиспе -> voilà
3. как он будет его использовать, и будет ли вообще - это ему решать

----- добавлено через ~2 мин. -----
если в лиспе можно вызывать команды, определённые в net, то наоборот это не работает?
koMon вне форума  
 
Непрочитано 29.11.2018, 10:32
1 | #20
trir


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


Цитата:
tc не использует .NET
вовсю использует
Цитата:
шарп через interop
он просто не использует AutoCAD NET API - так это он ССЗБ

как то так:
Код:
[Выделить все]
 
        public Point3d GetDist(ObjectId spl_id, int sp_id, int ep_id)
        {
            Point3d res;
            using (Transaction acTrans = spl_id.Database.TransactionManager.StartTransaction())
            {
                Spline spl = (Spline)acTrans.GetObject(spl_id, OpenMode.ForRead);
                double sdist = spl.GetDistAtPoint(spl.GetFitPointAt(sp_id));
                double edist = spl.GetDistAtPoint(spl.GetFitPointAt(ep_id));
                res = spl.GetPointAtDist((edist + sdist) / 2);
                acTrans.Abort();
            }
            return res;
        }
----- добавлено через ~28 мин. -----
Цитата:
если в лиспе можно вызывать команды, определённые в net, то наоборот это не работает?
работает, через AutoCAD NET API

Код:
[Выделить все]
 using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput; 
using Autodesk.AutoCAD.Runtime;

namespace InvokeLispSample
{
    public class CommandMethods
    {
        /* This TEST command calls the 'foo' LISP function which requires a list as argument
         * and returns the reversed list.
         * 
         * (defun foo (l) (reverse l)) (vl-acad-defun "foo")
         */
        [CommandMethod("Test", CommandFlags.Modal)]
        public void Test()
        {
            // build the arguments list
            ResultBuffer args = new ResultBuffer(
                new TypedValue((int)LispDataType.Text, "foo"),
                new TypedValue((int)LispDataType.ListBegin),
                new TypedValue((int)LispDataType.Text, "test"),
                new TypedValue((int)LispDataType.Int16, 42),
                new TypedValue((int)LispDataType.Double, 25.4),
                new TypedValue((int)LispDataType.ListEnd));

            // call the LISP fuction anf get the return value
            ResultBuffer result = Application.Invoke(args);

            // print the return value
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            ed.WriteMessage(result.ToString());
        }
    }
}

Последний раз редактировалось trir, 29.11.2018 в 11:02.
trir вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Знатоки Lisp, помогите найти середину сегмента сплайна.

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти прогоны длиной 6000мм, сечением 180х600мм Toxel Поиск литературы, чертежей, моделей и прочих материалов 3 22.01.2011 07:28
Помогите найти СП 31-115-2008 Открытые физкультурно-спортивные сооружения. Часть 4. Экстремальные виды спорта Aragorn Поиск литературы, чертежей, моделей и прочих материалов 2 02.12.2010 06:58
СНиП 11-10-75. Технология укладки асфальтовой смеси. Помогите найти! Maxim-t Поиск литературы, чертежей, моделей и прочих материалов 5 23.09.2010 00:11
Помогите найти описание функций lisp'a - vlisp-* Кулик Алексей aka kpblc Поиск литературы, чертежей, моделей и прочих материалов 4 30.06.2010 16:45
Помогите найти чертежи православных храмов leonbka Поиск литературы, чертежей, моделей и прочих материалов 5 12.03.2010 11:31