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

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

Два типа сплайнов и как сконвертировать один тип в другой?

Ответ
Поиск в этой теме
Непрочитано 12.04.2011, 11:10 #1
Два типа сплайнов и как сконвертировать один тип в другой?
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Есть в Автокаде два способа и соответственно два типа сплайна.
Первый - упрощенный, без 11, 12, 13 и 44 точечных пар
типа:

Код:
[Выделить все]
((-1 . <Entity name: -4031eca0>) (0 . "SPLINE") (330 . <Entity 
name: -40332308>) (5 . "CDB4") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 
. "0") (62 . 17) (420 . 10236462) (430 . "RAL CLASSIC$RAL 3013") (347 . <Entity 
name: -40332098>) (100 . "AcDbSpline") 
(70 . 0) (71 . 3) (72 . 22) (73 . 18) (74 . 0) 
(42 . 1.0e-010) 
(43 . 1.0e-010) 
(40 . 0.0) 
(40 . 0.0) 
(40 . 0.0) 
(40 . 0.0) 
(40 . 0.0666667) 
(40 . 0.133333) 
(40 . 0.2) 
(40 . 0.266667) 
(40 . 0.333333) 
(40 . 0.4) 
(40 . 0.466667) 
(40 . 0.533333) 
(40 . 0.6) 
(40 . 0.666667) 
(40 . 0.733333) 
(40 . 0.8) 
(40 . 0.866667) 
(40 . 0.933333) 
(40 . 1.0) 
(40 . 1.0) 
(40 . 1.0) 
(40 . 1.0) 
(10 94.2829 -15.0239 33.1825) 
(10 94.2837 -15.0233 33.148) 
(10 94.2852 -15.0185 33.0791) 
(10 94.2876 -15.0007 32.9769) 
(10 94.2898 -14.9724 32.8771) 
(10 94.292 -14.9339 32.7808) 
(10 94.2941 -14.8857 32.689) 
(10 94.2961 -14.8283 32.6026) 
(10 94.2979 -14.7622 32.5227) 
(10 94.2995 -14.6882 32.45) 
(10 94.301 -14.6071 32.3854) 
(10 94.3023 -14.5198 32.3295) 
(10 94.3033 -14.4271 32.2829) 
(10 94.3041 -14.3302 32.2461) 
(10 94.3047 -14.23 32.2196) 
(10 94.3051 -14.1275 32.2036) 
(10 94.3052 -14.0585 32.2) 
(10 94.3052 -14.0241 32.2))
и полный, типа:

Код:
[Выделить все]
((-1 . <Entity name: -4030a160>) (0 . "SPLINE") (330 . <Entity 
name: -40332308>) (5 . "114E4") (100 . "AcDbEntity") (67 . 0) (410 . "Model") 
(8 . "0") (62 . 1) (100 . "AcDbSpline") 
(70 . 0) (71 . 3) (72 . 24) (73 . 20) (74 . 18) 
(42 . 1.0e-010) 
(43 . 1.0e-010) 
(44 . 1.0e-010) 
(12 -0.586718 -0.674772 0.44771) 
(13 0.999848 -0.00030454 0.0174471) 
(40 . 0.0) 
(40 . 0.0) 
(40 . 0.0) 
(40 . 0.0) 
(40 . 0.0344921) 
(40 . 0.103578) 
(40 . 0.207237) 
(40 . 0.310921) 
(40 . 0.414619) 
(40 . 0.518317) 
(40 . 0.622021) 
(40 . 0.72573) 
(40 . 0.829447) 
(40 . 0.933168) 
(40 . 1.0369) 
(40 . 1.14063) 
(40 . 1.24437) 
(40 . 1.34811) 
(40 . 1.45185) 
(40 . 1.521) 
(40 . 1.55552) 
(40 . 1.55552) 
(40 . 1.55552) 
(40 . 1.55552) 
(10 94.3052 -14.0241 32.2) 
(10 94.2984 -14.0318 32.2051) 
(10 94.3116 -14.0736 32.1948) 
(10 94.3018 -14.1373 32.2057) 
(10 94.3058 -14.2309 32.2172) 
(10 94.3039 -14.3306 32.2446) 
(10 94.3034 -14.4279 32.2812) 
(10 94.3023 -14.5207 32.3279) 
(10 94.301 -14.6082 32.3839) 
(10 94.2995 -14.6894 32.4487) 
(10 94.2979 -14.7635 32.5215) 
(10 94.2961 -14.8297 32.6016) 
(10 94.2941 -14.8872 32.6881) 
(10 94.2922 -14.9355 32.7799) 
(10 94.2893 -14.9741 32.877) 
(10 94.2894 -15.0023 32.9747) 
(10 94.2796 -15.0189 33.0731) 
(10 94.2951 -15.0233 33.1258) 
(10 94.2714 -15.0239 33.1823) 
(10 94.2829 -15.0239 33.1825) 

(11 94.3052 -14.0241 32.2) 
(11 94.3052 -14.0585 32.2) 
(11 94.3051 -14.1275 32.2036) 
(11 94.3047 -14.23 32.2196) 
(11 94.3041 -14.3302 32.2461) 
(11 94.3033 -14.4271 32.2829) 
(11 94.3023 -14.5198 32.3295) 
(11 94.301 -14.6071 32.3854) 
(11 94.2995 -14.6882 32.45) 
(11 94.2979 -14.7622 32.5227) 
(11 94.2961 -14.8283 32.6026) 
(11 94.2941 -14.8857 32.689) 
(11 94.292 -14.9339 32.7808) 
(11 94.2898 -14.9724 32.8771) 
(11 94.2876 -15.0007 32.9769) 
(11 94.2852 -15.0185 33.0791) 
(11 94.2837 -15.0233 33.148) 
(11 94.2829 -15.0239 33.1825))
У меня есть чисто прикладная задача: разбить сложный 3D солид на плоскости, а потом их разбить на линии, сплайны, дуги и т.п. примитивы.
Из них я делаю "упрощенную графику" для динамических блоков.
Я не могу физически обрисовать тысячи таких солидов, тем более, что не хочу их уродовать кандовой обрисовкой.

Получаю в результате разбивки упрощенные сплайны. Они любят подвешивать кад при приблежении к их концам курсора. Вместо опорных вершин содержат в 10 паре (как бы это выразиться) точки направления, те, что в нормальном сплане 11 парой указаны.

Так вот, сама проблема: Как из упрощенного сплайна сделать нормальный и чтобы они совпали?

Если говорить конкретнее, то как найти или вычислить опорные вершины в упрощенном сплайне?

------------------

Можно, наверное, сконвертировать упрощенный сплайн в 3D полилинию, а потом как-то обратно в сплайн превратить, но боюсь не совпадут. Зато гладенькие будут.
У меня есть сплайны из всего 4 точек. Дуга в результате получается. Надо чтобы дуга и получилась. Как? Сейчас башка взорвется!

Последний раз редактировалось Supermax, 12.04.2011 в 11:21.
Просмотров: 3415
 
Непрочитано 12.04.2011, 11:38
#2
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Supermax, боюсь показаться наивным, но все же. А в vla представлении упрощенного сплайна нет свойств ControlPoints и FitPoints, просто мне упрощенный сплайн получить не удалось
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 12.04.2011, 11:51
#3
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Код:
[Выделить все]
Select object: ; IAcadSpline: AutoCAD Spline Interface
; Property values:
;   Application (RO) = #<VLA-OBJECT IAcadApplication 00d591b4>
;   Area (RO) = AutoCAD.Application: Non planar entity
;   Closed (RO) = 0
;   ControlPoints = (94.2829 -15.0239 33.1825 94.2837 -15.0233 33.148 ... )
;   Degree (RO) = 3
;   Document (RO) = #<VLA-OBJECT IAcadDocument 0156dae0>
;   EndTangent = AutoCAD.Application: General modeling failure
;   FitPoints = nil
;   FitTolerance = 0.0
;   Handle (RO) = "CDB4"
;   HasExtensionDictionary (RO) = 0
;   Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 13b9edb4>
;   IsPeriodic (RO) = 0
;   IsPlanar (RO) = 0
;   IsRational (RO) = 0
;   Knots = (0.0 0.0 0.0 0.0 0.0666667 0.133333 ... )
;   Layer = "0"
;   Linetype = "ByLayer"
;   LinetypeScale = 1.0
;   Lineweight = -1
;   Material = "ByBlock"
;   NumberOfControlPoints (RO) = 18
;   NumberOfFitPoints (RO) = 0
;   ObjectID (RO) = -1077013664
;   ObjectName (RO) = "AcDbSpline"
;   OwnerID (RO) = -1077093128
;   PlotStyleName = "Color_17"
;   StartTangent = AutoCAD.Application: General modeling failure
;   TrueColor = #<VLA-OBJECT IAcadAcCmColor 16b68240>
;   Visible = -1
;   Weights = AutoCAD.Application: No weights available for polynomial spline
; Methods supported:
;   AddFitPoint (2)
;   ArrayPolar (3)
;   ArrayRectangular (6)
;   Copy ()
;   Delete ()
;   DeleteFitPoint (1)
;   ElevateOrder (1)
;   GetBoundingBox (2)
;   GetControlPoint (1)
;   GetExtensionDictionary ()
;   GetFitPoint (1)
;   GetWeight (1)
;   GetXData (3)
;   Highlight (1)
;   IntersectWith (2)
;   Mirror (2)
;   Mirror3D (3)
;   Move (2)
;   Offset (1)
;   PurgeFitData ()
;   Reverse ()
;   Rotate (2)
;   Rotate3D (3)
;   ScaleEntity (2)
;   SetControlPoint (2)
;   SetFitPoint (2)
;   SetWeight (2)
;   SetXData (2)
;   TransformBy (1)
;   Update ()
и еще нашел по кубическим и квадратическим сплайнам
http://www.tver.mesi.ru/e-lib/res/63...lashmx_10.html

Еще хочу заметить, что оба типа сплайнов кубические!

---------------------------------

Первые результаты:

Как сделать из сплайна с 11, 12, 13 и 44 парами простой сплайн - очень просто.

Код:
[Выделить все]
(setq ab123 (vla-get-Knots (vlax-ename->vla-object (car (entsel)))))
(vla-put-Knots  (vlax-ename->vla-object (car (entsel))) ab123)
Прочли "опорные точки векторов направления" и тут же их обратно записали.
Сплайн бряк, и сделался простым, автоматически.
А вот как обратно в сложный превратить - не знаю.

Но именно простое описание сплайна используется при построении 3D солидов, боди и т.п. элементов.
В этих описаниях есть данные 40-ых пар и 10-ых. К примеру:

Код:
[Выделить все]
"intcurve-curve $-1 -1 $-1 forward { exact\037int\037cur 20900 full nubs 3 open 12 " 
" 0 3 0.090909090909090023 1 0.18181818181820006 1 0.27272727272730002 1 0.36363636363640012 1 " 
" 0.4545454545455001 1 0.54545454545450012 1 0.63636363636360016 1 0.72727272727270009 1 0.81818181818180014 1 " 
" 0.90909090909090018 1 1 3 " 
" 104.10519099398697 -14.024057482560011 32.20000002562 " 
" 104.11357689155297 -14.061151892200016 32.199957442780004 " 
" 104.13217258511197 -14.138648863570012 32.203366359539999 " 
" 104.16223627850897 -14.263365922440016 32.221046761140002 " 
" 104.19385034068397 -14.393844239500012 32.253451879529997 " 
" 104.22853745873697 -14.526645536720011 32.300850584060001 " 
" 104.26504740899797 -14.660798650390014 32.363735831810004 " 
" 104.30139574540198 -14.785246801950017 32.43422427993 " 
" 104.33238031558096 -14.890889511610013 32.500235603029999 " 
" 104.35839840779298 -14.985376367480015 32.560329412659996 " 
" 104.37772828287596 -15.070788736300017 32.612742602780003 " 
" 104.38933222790396 -15.148575278730014 32.656652854409998 " 
" 104.39161195093197 -15.195673592410017 32.680474575709994 " 
" 104.39142368745198 -15.218141729780015 32.691276197009998 " 
" 0 "
Это описание грани intcurve-curve из декодированного списка 1-ых точечных пар элемента боди.
Как видим,

Цитата:
" 0 3 0.090909090909090023 1 0.18181818181820006 1 0.27272727272730002 1 0.36363636363640012 1 "
" 0.4545454545455001 1 0.54545454545450012 1 0.63636363636360016 1 0.72727272727270009 1 0.81818181818180014 1 "
" 0.90909090909090018 1 1 3 "
0 3 - 0.0 0.0 0.0 0.0
1 3 - 1.0 1.0 1.0 1.0
все остальное между ними и 1 - разделитель
Строка " 0 " - маркер конца описания сплайна

Цитата:
" 104.10519099398697 -14.024057482560011 32.20000002562 "
" 104.11357689155297 -14.061151892200016 32.199957442780004 "
" 104.13217258511197 -14.138648863570012 32.203366359539999 "
" 104.16223627850897 -14.263365922440016 32.221046761140002 "
" 104.19385034068397 -14.393844239500012 32.253451879529997 "
" 104.22853745873697 -14.526645536720011 32.300850584060001 "
" 104.26504740899797 -14.660798650390014 32.363735831810004 "
" 104.30139574540198 -14.785246801950017 32.43422427993 "
" 104.33238031558096 -14.890889511610013 32.500235603029999 "
" 104.35839840779298 -14.985376367480015 32.560329412659996 "
" 104.37772828287596 -15.070788736300017 32.612742602780003 "
" 104.38933222790396 -15.148575278730014 32.656652854409998 "
" 104.39161195093197 -15.195673592410017 32.680474575709994 "
" 104.39142368745198 -15.218141729780015 32.691276197009998 "
10-ые точечные пары.

Функция Entmake и Entmakex могут создавать только сложные сплайны и если у вас нет данных для 11, 12, 13 и 44 пар, то:
1. 44 пара делается такой же как и 43.
2. 12 и 13 пары вообще не указываются ( Entmake и Entmakex все чудненько и без них создает)
3. 11 пары делаем из 10 предварительно убрав предпоследнюю и вторую точки. Чтобы их на две было меньше.

Делаем Entmake - получается гадость, но не торопимся выбрасывать сплайн в утиль.
Принудительно прописываем ему его контрольные точки точки

Код:
[Выделить все]
(setq a123 (mapcar 'list 
'(
104.08289525939198 -15.023905298260011 33.182547595220001
104.08367842113597 -15.023303119750011 33.14803356561
104.08524351595698 -15.018520538600015 33.079064904649996
104.08756173518897 -15.000687970810013 32.976894852309997
104.08982612698797 -14.972385700630014 32.87711235143
104.09201167188996 -14.933919757960012 32.780794556689997
104.09409514474098 -14.885702946090014 32.688972075240002
104.09605464362296 -14.828252315030014 32.602628391300001
104.09786827547298 -14.762185901530017 32.522690355500004
104.09951777616297 -14.688210955910016 32.450012102860001
104.10098421356096 -14.607122526230015 32.385373384479998
104.10225316529296 -14.519789358750018 32.329465102200004
104.10330988946797 -14.427146984960018 32.282884965069996
104.10414409733497 -14.330184913460016 32.24613062217
104.10474604014597 -14.229955346650016 32.219599283639994
104.10510967297297 -14.127543286920016 32.203572328549996
104.10519100288697 -14.058549629780018 32.199999849769995
104.10519099398697 -14.024057482560011 32.20000002562)))
(setq spis (apply 'append a123))
(setq pointpara (cons 0 (- (length spis) 1)))
(vla-put-ControlPoints (vlax-ename->vla-object (car(entsel)))
(vlax-safearray-fill (vlax-make-safearray vlax-vbDouble pointpara) spis))
При этом рухнули точки Knots!

Принудительно прописываем точки Knots.

Код:
[Выделить все]
(setq a123 (mapcar 'list 
'(
0.0 0.0 0.0 0.0 0.066666666666670024 0.13333333333330002 0.20000000000000001 0.26666666666670003
0.33333333333330006 0.40000000000000002 0.46666666666670009 0.53333333333330002 0.59999999999999998
0.66666666666670027 0.73333333333330009 0.80000000000000004 0.86666666666670023 0.93333333333330004
1.0 1.0 1.0 1.0
)))
(setq spis (apply 'append a123))
(setq pointpara (cons 0 (- (length spis) 1)))
(vla-put-Knots (vlax-ename->vla-object (car(entsel)))
(vlax-safearray-fill (vlax-make-safearray vlax-vbDouble pointpara) spis))
Получаем сплайн, который мама родная не оличит от грани боди по данным которой он сделан.

та-та-та-та!

Последний раз редактировалось Supermax, 12.04.2011 в 20:36.
Supermax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Два типа сплайнов и как сконвертировать один тип в другой?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание нового типа линий Apelsinov AutoCAD 915 08.07.2022 12:36
Максимальная ошибка в узле 50797 по направлению 2: 0.387%. Kastrulkin Расчетные программы 11 06.12.2011 15:35
Непонятки со связями bezo Расчетные программы 8 06.06.2010 12:34
Как заменить один блок на другой? (не все) Абдулнасир Динамические блоки 2 21.05.2009 11:38
ГОСТ на ванты и оттяжки ??? зщцук? Поиск литературы, чертежей, моделей и прочих материалов 1 17.05.2005 06:53