Последние сообщения

Последние сообщения

Страницы: 1 ... 4 5 [6] 7 8 ... 10
51
ObjectARX / Re: Ошибка intersectWith()
« Последний ответ от pucher 12-05-2024, 08:51:41 »
Посмотри на строки 38 и 39.
Добавил,
Код - C++ [Выбрать]
  1. if (pEnt1->intersectWith(pEnt2, AcDb::kOnBothOperands, points) != Acad::eOk)
  2.         {
  3.                 pEnt1->close();
  4.                 pEnt2->close();
  5.                 return;
  6.         }
Только функция в случае наличия и отсутствия общих точек срабатывает правильно. Если после нее добавить
Код - C++ [Выбрать]
  1. AcGePoint3d acGePoint3d=points[0];
Там будет точка с правильными координатами.
У меня ошибка вылетает не во время выполнения вызова какой-либо из функций, а после завершения основной функции F4().
52
ObjectARX / Re: Ошибка intersectWith()
« Последний ответ от Александр Ривилис 11-05-2024, 23:35:26 »
- независимо от результата intersectWith() объекты закрыли в 51, 52 строках через close();
Да? Ты уверен? :) Посмотри на строки 38 и 39.
53
ObjectARX / Re: Ошибка intersectWith()
« Последний ответ от pucher 11-05-2024, 23:31:12 »
Я смотрю, что в твоем коде далеко не всегда вызывается метод pEnt1->close() и pEnt2->close() - а именно в случае если объекты не пересекаются.
Как я понимаю, закрытие производится только после успешного открытия через acdbOpenAcDbEntity(). Любой код ошибки - объект не открылся, закрывать, соответственно, нечего. Например:
- открыли объект через acdbOpenAcDbEntity();
- выполнили необходимые манипуляции с объектом, в моем случае intersectWith();
- независимо от результата intersectWith() объекты закрыли в 51, 52 строках через close();
Поэтому не понял замечание.
54
ObjectARX / Re: Ошибка intersectWith()
« Последний ответ от Александр Ривилис 11-05-2024, 21:27:44 »
Я смотрю, что в твоем коде далеко не всегда вызывается метод pEnt1->close() и pEnt2->close() - а именно в случае если объекты не пересекаются.
Очень рекомендую использовать интеллектуальные указатели (типа AcDbObjectPointer<AcDbLine> или AcDbEntityPointer)
Они автоматически закроют объект (вызовут его метод close()) по выходе из области видимости локальной переменной.

55
pucher,
Источник вот: https://help.autodesk.com/view/OARXMAC/2023/ENU/?guid=OARXMAC-RefGuide-AcDbEntity__layer_const (хотя не факт, что следует использовать документацию для MAC. Правильнее: https://help.autodesk.com/view/OARX/2025/ENU/?guid=OARX-RefGuide-AcDbEntity__layer_const)
Есть два метода layer(). В тексте выше везде шла речь о методе, который возвращает ACHAR *, а не AcString (через ссылку), как в URL, который ты дал.
56
ObjectARX / Ошибка intersectWith()
« Последний ответ от pucher 11-05-2024, 20:55:28 »
Добрый. Если выбрать 2 не пересекающихся объекта, функция работает, как задумано. Если выбрать пересекающиеся объекты, то после выхода из функции вылетает ошибка.
Код - C++ [Выбрать]
  1. void F4()
  2. {
  3.         int es1, es2;
  4.         ads_name ent1, ent2;
  5.         ads_point pt1, pt2;
  6.         AcDbObjectId entId1, entId2;
  7.         AcDbEntity* pEnt1 = NULL;
  8.         AcDbEntity* pEnt2 = NULL;
  9.         AcGePoint3dArray points;
  10.  
  11.         if (acedEntSel(L"\nУкажите объект 1: ", ent1, pt1) != RTNORM)
  12.                 return;
  13.  
  14.         if (acdbGetObjectId(entId1, ent1) != Acad::eOk)
  15.                 return;
  16.  
  17.         if (acdbOpenAcDbEntity(pEnt1, entId1, AcDb::kForRead) != Acad::eOk)
  18.                 return;
  19.  
  20.         if (acedEntSel(L"\nУкажите объект 2: ", ent2, pt2) != RTNORM)
  21.         {
  22.                 pEnt1->close();
  23.                 return;
  24.         }
  25.  
  26.         if (acdbGetObjectId(entId2, ent2) != Acad::eOk)
  27.         {
  28.                 pEnt1->close();
  29.                 return;
  30.         }
  31.  
  32.         if (acdbOpenAcDbEntity(pEnt2, entId2, AcDb::kForRead) != Acad::eOk)
  33.         {
  34.                 pEnt1->close();
  35.                 return;
  36.         }
  37.  
  38.         if (pEnt1->intersectWith(pEnt2, AcDb::kOnBothOperands, points) != Acad::eOk)
  39.                 return;
  40.  
  41.         if (points.length() == 0)
  42.                 acutPrintf(L"\nОбъекты не пересекаются. ");
  43.  
  44.         else
  45.         {
  46.                 acutPrintf(L"\nТочки пересечения:");
  47.                 for (int i = 0; i < points.length(); ++i)
  48.                         acutPrintf(L"\n %d: %.6f %.6f %.6f", i + 1, points[i].x, points[i].y, points[i].z);
  49.         }
  50.  
  51.         pEnt1->close();
  52.         pEnt2->close();
  53.  
  54.         return;
  55. }


57
ObjectARX / Re: фрагментация оперативной памяти?
« Последний ответ от pucher 11-05-2024, 20:25:17 »
А вот тут интересный момент. Метод layer() возвращает строку ACHAR *, которую потом нужно освободить, о чем написано в документации.
Можно источник, где написано о необходимости явного освобождения памяти? В описании метода такого не вижу https://help.autodesk.com/view/OARXMAC/2023/ENU/?guid=OARXMAC-RefGuide-AcDbEntity__layer_AcString___const
58
AutoLisp / VisualLISP и DCL / Re: номер цвета экрана
« Последний ответ от altver 10-05-2024, 20:45:56 »
Спасибо, Александр!
замечание принимается!
59
AutoLisp / VisualLISP и DCL / Re: номер цвета экрана
« Последний ответ от Александр Ривилис 10-05-2024, 20:37:47 »
altver,
А читать документацию не пробовал? https://help.autodesk.com/view/ACD/2025/ENU/?guid=GUID-5ECA99D3-3864-4CEB-A7FA-73755F952825
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com)
  2. (defun c:Example_GraphicsWinModelBackgrndColor()
  3.     ;; This example returns the current setting of
  4.     ;; GraphicsWinModelBackgrndColor. It then changes the value, and finally
  5.     ;; it resets the value back to the original setting.
  6.     (setq acadObj (vlax-get-acad-object))
  7.     (setq doc (vla-get-ActiveDocument acadObj))
  8.     (setq preferences (vla-get-Preferences acadObj))
  9.        
  10.     ;; Retrieve the current GraphicsWinModelBackgrndColor value
  11.     (setq currGraphicsWinModelBackgrndColor (vlax-variant-change-type (vla-get-GraphicsWinModelBackgrndColor (vla-get-Display preferences)) vlax-vbLong))
  12.     (alert (strcat "The current value for GraphicsWinModelBackgrndColor is " (itoa (vlax-variant-value currGraphicsWinModelBackgrndColor))))
  13.    
  14.     ;; Change the value for GraphicsWinModelBackgrndColor
  15.     (vla-put-GraphicsWinModelBackgrndColor (vla-get-Display preferences) (vlax-make-variant 127 19))
  16.     (setq newValue (vlax-variant-change-type (vla-get-GraphicsWinModelBackgrndColor (vla-get-Display preferences)) vlax-vbLong))
  17.     (alert (strcat "The new value for GraphicsWinModelBackgrndColor is " (itoa (vlax-variant-value newValue))))
  18.    
  19.     ;; Reset GraphicsWinModelBackgrndColor to its original value
  20.     (vla-put-GraphicsWinModelBackgrndColor (vla-get-Display preferences) currGraphicsWinModelBackgrndColor)
  21.     (alert (strcat "The GraphicsWinModelBackgrndColor value is reset to " (itoa (vlax-variant-value currGraphicsWinModelBackgrndColor))))
  22. )
60
AutoLisp / VisualLISP и DCL / номер цвета экрана
« Последний ответ от altver 10-05-2024, 20:34:04 »
добрый день!

Необходимо опредилить номер цвета экрана.
Есть какая-то переменная?
Страницы: 1 ... 4 5 [6] 7 8 ... 10