Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Балиев от 04-07-2016, 15:45:34

Название: Метод Slice
Отправлено: Балиев от 04-07-2016, 15:45:34
Насколько я понимаю, метод Slice с параметром "true" генерирует обе части разрезанного примитива, например, так:
Код - C# [Выбрать]
  1. Solid3d acSol3DSlice = acSol3D.Slice(acPlane, true);
При этом имя "acSol3DSlice" может использоваться для записи в Block Table Records только одной части.
Код - C# [Выбрать]
  1. acBlkTblRec.AppendEntity(acSol3DSlice);
Как записать вторую часть?

Заранее благодарен.
Название: Re: Метод Slice
Отправлено: Дмитрий Загорулькин от 04-07-2016, 16:05:53
А вторая часть - это не исходный солид?
Название: Re: Метод Slice
Отправлено: Балиев от 04-07-2016, 16:40:40
Думаю, что нет, поскольку в описании метода сказано, что параметр "true/false" есть "Input flag to indicate whether the other side of the solid is to be generated".
Название: Re: Метод Slice
Отправлено: Дмитрий Загорулькин от 04-07-2016, 16:47:39
Думаю, что нет
А проверить? :)
Input flag to indicate whether the other side of the solid is to be generated
Я думаю, что возвращаемое значение как раз и есть сгенерированный солид.
Название: Re: Метод Slice
Отправлено: Балиев от 04-07-2016, 17:14:59
А проверить?
Идея хорошая, только как это сделать? Исходный солид там, действительно, есть, но он, вполне возможно, что и должен оставаться. Во всяком случае, нигде не сказано, что он должен исчезать. А вторая часть разрезанного солида отсутствует, поскольку мы ее не занесли в Block Table Records.
Название: Re: Метод Slice
Отправлено: Дмитрий Загорулькин от 04-07-2016, 17:19:24
Запустить код и проверить на чертеже. Если исходный солид будет обрезан, а полученный солид будет отрезанная его часть - значит, предположение верно.
Название: Re: Метод Slice
Отправлено: Балиев от 04-07-2016, 17:35:08
Хм, тут у меня, вообще, какая то хрень происходит... Ладно, завтра запишу на видео - посмотришь. Но, похоже, я все-таки прав...
Название: Re: Метод Slice
Отправлено: Александр Ривилис от 04-07-2016, 19:31:33
Насколько я понимаю, метод Slice с параметром "true" генерирует обе части разрезанного примитива, например, так:
Код - C# [Выбрать]
  1. Solid3d acSol3DSlice = acSol3D.Slice(acPlane, true);
При этом имя "acSol3DSlice" может использоваться для записи в Block Table Records только одной части.
Код - C# [Выбрать]
  1. acBlkTblRec.AppendEntity(acSol3DSlice);
Как записать вторую часть?

Заранее благодарен.
Если передан параметр false, то в исходном acSol3D остаётся "положительная" часть исходного Solid3d, а возвращается пустой Solid3d. Если параметр true, то одна часть ("положительная") остаётся в исходном acSol3D, а вторая ("отрицательная) часть возвращается в acSol3DSlice. Так что Дмитрий Загорулькин дал правильный ответ.
Название: Re: Метод Slice
Отправлено: Дмитрий Загорулькин от 04-07-2016, 20:54:02
а возвращается пустой Solid3d
Off-Topic: показать
Как-то нелогично сделали. Потом его еще отдиспозить нужно не забыть. Лучше бы null возвращали или ссылку на исходный солид. Мысли вслух :)
Название: Re: Метод Slice
Отправлено: Алексей Терно от 05-07-2016, 10:10:45
отдиспозить
Ой, какое неудачное слово, не с первого раза правильно прочитал )))
Название: Re: Метод Slice
Отправлено: Балиев от 05-07-2016, 12:12:32
Если передан параметр false, то в исходном acSol3D остаётся "положительная" часть исходного Solid3d, а возвращается пустой Solid3d. Если параметр true, то одна часть ("положительная") остаётся в исходном acSol3D, а вторая ("отрицательная) часть возвращается в acSol3DSlice.
Так оно и есть, спасибо. Но там все путает какой то баг в графике, из-за которого трудно разобраться. Вот смотри:
1. Запускаю код, создающий прямоугольную пластину (Solid3D), указываю базовую точку, после чего на некотором расстоянии от базовой точки пластина разрезается методом Slice с параметром true и  "положительная" часть окрашивается в красный цвет. И вот, что наблюдаю:
.
Название: Re: Метод Slice
Отправлено: Александр Ривилис от 05-07-2016, 22:35:56
Поиграйся с включением/выключением аппаратного ускорения AutoCAD. Если не поможет - покажи код команды, которая разрезает Solid3d.
Название: Re: Метод Slice
Отправлено: Балиев от 06-07-2016, 12:48:49
А программно включать/выключать аппаратное ускорение можно? Потому что это помогает только, если переключать ускорение после отработки кода.
Название: Re: Метод Slice
Отправлено: Александр Ривилис от 06-07-2016, 13:44:49
http://adn-cis.org/api-dlya-grafnastr-(3dconfig).html
Название: Re: Метод Slice
Отправлено: Балиев от 06-07-2016, 13:57:26
Да, все работает, спасибо!
Название: Re: Метод Slice
Отправлено: Александр Ривилис от 06-07-2016, 18:43:12
Странно это всё...
Название: Re: Метод Slice
Отправлено: Балиев от 11-02-2020, 13:34:59
http://adn-cis.org/api-dlya-grafnastr-(3dconfig).html
Попытался откомпилировать в VS2019 под AutoCAD 2021 - говорит, что "The type or namespace name 'HardwareFeature' does not exist in the namespace 'Autodesk.AutoCAD.GraphicsSystem' (are you missing an assembly reference?)". То же самое и для AutoCAD 2018. Там, случайно, не нужно давать ссылку на какую-нибудь специальную библиотеку?
Название: Re: Метод Slice
Отправлено: Александр Ривилис от 11-02-2020, 13:37:22
http://adn-cis.org/api-dlya-grafnastr-(3dconfig).html
Попытался откомпилировать в VS2019 под AutoCAD 2021 - говорит, что "The type or namespace name 'HardwareFeature' does not exist in the namespace 'Autodesk.AutoCAD.GraphicsSystem' (are you missing an assembly reference?)". То же самое и для AutoCAD 2018. Там, случайно, не нужно давать ссылку на какую-нибудь специальную библиотеку?
AutoCAD 2021 еще официально не вышел. Обсуждение пока возможно только на бета-форуме.
Название: Re: Метод Slice
Отправлено: Александр Ривилис от 11-02-2020, 14:16:05
Балиев,
Начиная с AutoCAD 2015 этот код должен выглядеть так:
Код - C# [Выбрать]
  1. [CommandMethod("ToggleHWAcceleration")]
  2. public void ToggleHWAcceleration()
  3. {
  4.   using (Autodesk.AutoCAD.GraphicsSystem.Configuration config =
  5.     new Autodesk.AutoCAD.GraphicsSystem.Configuration())
  6.   {
  7.     if (config.IsHardwareAccelerationAvailable())
  8.     {
  9.       config.setHardwareAcceleration(
  10.         !config.IsHardwareAccelerationEnabled()
  11.       );
  12.     }
  13.   }
  14. }
Название: Re: Метод Slice
Отправлено: Балиев от 11-02-2020, 15:49:31
Спасибо!
Название: Re: Метод Slice
Отправлено: Балиев от 10-03-2020, 18:11:38
Если передан параметр false, то в исходном acSol3D остаётся "положительная" часть исходного Solid3d, а возвращается пустой Solid3d. Если параметр true, то одна часть ("положительная") остаётся в исходном acSol3D, а вторая ("отрицательная) часть возвращается в acSol3DSlice.
Если я работаю с параметром false, то нужно ли перезаписывать в Block Table Records исходный acSol3D?
Название: Re: Метод Slice
Отправлено: Александр Ривилис от 10-03-2020, 18:24:44
Если передан параметр false, то в исходном acSol3D остаётся "положительная" часть исходного Solid3d, а возвращается пустой Solid3d. Если параметр true, то одна часть ("положительная") остаётся в исходном acSol3D, а вторая ("отрицательная) часть возвращается в acSol3DSlice.
Если я работаю с параметром false, то нужно ли перезаписывать в Block Table Records исходный acSol3D?
Перезаписывать ничего не нужно.
Название: Re: Метод Slice
Отправлено: Балиев от 30-11-2020, 16:48:45
Если передан параметр false, то в исходном acSol3D остаётся "положительная" часть исходного Solid3d, а возвращается пустой Solid3d.
А в случае, если секущая плоскость "промахнулась" мимо исходного солида, то что останется в acSol3D и как это определить?
Название: Re: Метод Slice
Отправлено: Александр Ривилис от 30-11-2020, 17:57:45
Балиев,
Останется то что и было - во всяком случае так об этом говорит документация. Но ты можешь и сам проверить.