Тема: Обрезание рамкой - SendCommand, extrim, handent

Здравствуйте,
подскажите пожалуйста, где ошибка? Собственно, не "зацепляется" квадратная рамка, а в командной строке выдается сообщение - *Invalid selection*. Спасибо.

Sub test()
    Dim point(0 To 2) As Double
    Dim coords(0 To 7) As Double
    Dim plineRef As AcadLWPolyline
    Dim sHandle As String
    Dim sPoint As String
    ' окружность, часть которой хочется отсечь
    point(0) = 10: point(1) = 10: point(2) = 0
    ThisDrawing.ModelSpace.AddCircle point, 10
    ' рамка
    coords(0) = -10:    coords(1) = -10:    coords(2) = -10:    coords(3) = 10:
    coords(4) = 10:     coords(5) = 10:     coords(6) = 10:     coords(7) = -10:
    Set plineRef = ThisDrawing.ModelSpace.AddLightWeightPolyline(coords)
    plineRef.Closed = True
    sHandle = plineRef.Handle
    ' точка вне рамки
    sPoint = "0,20"
    ThisDrawing.SendCommand "_extrim" & vbCr & "(handent " & """" & sHandle & """" & ")" & vbCr & sPoint & vbCr
End Sub

Re: Обрезание рамкой - SendCommand, extrim, handent

Не знаю, почему не получается через handle. Может дело где-то внутри команды _extrim.
С некоторыми ограничениями будет работать:

ThisDrawing.SendCommand "_extrim" & vbCr & "l" & vbCr & sPoint & vbCr

Re: Обрезание рамкой - SendCommand, extrim, handent

Так ведь это експрессовский лисп..
В нем для выбора используется функция

acet-ui-single-select

Наверное в ней и дело.. Точно не скажу, - лисп не знаю((

Re: Обрезание рамкой - SendCommand, extrim, handent

> Сидор Лютый
У тебя мозги программерские, не то что у меня,
чё он хочет никак не врублюсь
Выбрать рамкой?
На фига SendCommand (избегаю всегда,  если возможно)
~'J'~

Re: Обрезание рамкой - SendCommand, extrim, handent

Rustam (2007-06-22 19:37:40)

Скопировала код - всё нормально отработало - рамка
"зацепляется", а сообщение — *Invalid selection*-не появилось :).

Re: Обрезание рамкой - SendCommand, extrim, handent

OSMODE=????
OSMODE=0

Re: Обрезание рамкой - SendCommand, extrim, handent

> Fatty
Когда на вопрос "Как?" отвечаешь вопросом "А зачем?" люди почему-то обижаются часто)))
Ну надо человеку, видимо именно через extrim обрезать объекты..
А у Adel вообще все прекрасно работает..

Re: Обрезание рамкой - SendCommand, extrim, handent

> Сидор Лютый
Ну если тупой я - так что теперь - вешаться?
Скинь коду посмотреть а то спать не могу :)
~'J'~

Re: Обрезание рамкой - SendCommand, extrim, handent

Спасибо всем, кто откликнулся на мой вопрос.
>to Сидор Лютый

ThisDrawing.SendCommand "_extrim" & vbCr & "l" & vbCr & sPoint & vbCr

А каким образом все-таки передать в командную строку выделенную полилинию-рамку? Передать точку, через которую она проходит, например в данном случае (-10,-10). Так в принципе все работает на одном компе, но на другом нет. Выделять полилинию посредством точки, через которую она полилиния проходит - это казалось бы крайняя мера, когда в коде нет ссылки на объект класса AcadEntity. Тем опаснее, что в окрестности точки могут находится другие объекты, которые могут быть выделены вместо требуемого. Но если есть ссылка objRef, то в командную строку нужно передавать objRef.Handle.
>to Adel
Если у Вас код работает, то может быть у меня в 7-м Acade какие-то системные переменные не так установлены.
>to BP
Скорее всего OSMODE здесь не причем. Но тем не менее установил OSMODE =0, но по прежнему не работает.
******
Вот что именно появляется в окне сообщений и командной строке:
Command: _vbarun
Command: _extrim
Pick a POLYLINE, LINE, CIRCLE, ARC, ELLIPSE, IMAGE or TEXT for cutting edge...
Select objects: (handent "144")
*Invalid selection*
Expects a point or
Window/Last/Crossing/BOX/ALL/Fence/WPolygon/CPolygon/Group/Add/Remove/Multiple/P
revious/Undo/AUto/SIngle/SUbobject/Object
Select objects: 0,20
Specify opposite corner:
И здесь она ждет ввода, это и понято, ведь объект полилиния (handent "144") не был воспринят в командной строке. Но почему не воспринимается???
>to Сидор Лютый
На фига SendCommand (избегаю всегда, если возможно)
Согласен с вами на все сто. Я SendCommand очень редко использую (1 раз на тысячу сток). Но хотелось одним разом отсекать все лишние элементы протяженных объектов. Подумал что если есть подобная фича у Acad, то зачем изобретать похожее еще раз. Но откровенно склоняюсь к мысли, что следует самому написать код отсечения (внутри/снаружи) с помощью замкнутой полилинии, фрагментов другой полилинии, пересекающей эту замкнутую.

Re: Обрезание рамкой - SendCommand, extrim, handent

> rust2000
У меня - 2006. И проверила, что OSMODE точно не причем.

Re: Обрезание рамкой - SendCommand, extrim, handent

У меня AutoCAD-2006 и та же хрень, не работает.
Покапался с командой ExTrim, по всей видимости данная команда является командой ARX, а не внутренней AutoCAD и имеено поэтому не работает. У меня она вообще не работает как с Lisp функциями, так и с Lisp переменными.
Почему работает у Adel не знаю.
Но проблема вполне решаема через внутреннюю команду Trim и даже с дополнительными возможностями при работе с трёхмеркой.
Единственная проблема возникает когда полилиния пересекает секущюю рамку дважды или больше, отсечение идёт только первой части.
Поэтому в примере отсечение сделал дважды, программе пофигу сколько раз его делать.
Что касается чисто программного отсечения, то боюсь не всё так просто, встроенного метода нет, а обработать все произвольные объекты думаю будет затруднительно.

Sub test()
Dim point(0 To 2) As Double
Dim coords(0 To 7) As Double
Dim plineRef As AcadEntity
Dim sHandle As String
Dim Cross As String
   point(0) = 10: point(1) = 10: point(2) = 0
   ThisDrawing.ModelSpace.AddCircle point, 10
   coords(0) = -10: coords(1) = -10
   coords(2) = -10: coords(3) = 10
   coords(4) = 10: coords(5) = 10
   coords(6) = 10: coords(7) = -10
   Set plineRef = ThisDrawing.ModelSpace.AddLightWeightPolyline(coords)
   plineRef.Closed = True
   sHandle = plineRef.Handle
   Cross = coords(0) - 1 & "," & coords(1) - 1 & vbCr
   Cross = Cross & coords(4) + 1 & "," & coords(5) + 1 & vbCr
   With ActiveDocument
      .SendCommand "_trim" & vbCr & "(handent """ & sHandle & """)" & vbCr & vbCr
      .SendCommand "_crossing" & vbCr & Cross & "_crossing" & vbCr & Cross & vbCr
   End With
End Sub

Re: Обрезание рамкой - SendCommand, extrim, handent

> Dron
Спасибо за ответ. В моем конкретном случае такое решение вполне подходит, тем более, что обрезные рамки у меня имеют строго горизонтальные и вертикальные стороны, и легко добавлять соответствующие cross-рамки. В общем же случае стрижку при помощи полилинии произвольной формы конечно удобно было бы осуществлять при помощи extrim, но последняя внутри кода вероятно очень тонко глючит. Если напишу функцию в VBA, надеюсь не глючную, выложу здесь.

> Сидор Лютый
Из Express Tools узнал что
1) extrim - это lisp-овская функция, входящая в состав express tools, которая обращается к встроенной acad-Функции trim, хранится в файле extrim.lsp. Но в lisp-е я тоже 0.
2) Autodesk не несет ответственность за ошибки в Express Tools и не занимается их технической поддержкой - так написано в AutoCAD Express Tools FAQ.

Re: Обрезание рамкой - SendCommand, extrim, handent

>to Сидор Лютый
А каким образом все-таки передать в командную строку выделенную полилинию-рамку?

так эта строчка и передаст extrim-у рамку:

ThisDrawing.SendCommand "_extrim" & vbCr & "l" & vbCr & sPoint & vbCr

Тут вместо handle указывается "L" - то есть ссылка на последний созданный в документе объект. (В этом и есть ограничение. Запускать extrim желательно сразу же после создания рамки.) Благо опции команды select (Last, Previous и т.д.) этот лисп понимает. А вот по хендлу уже не может выбрать.

Re: Обрезание рамкой - SendCommand, extrim, handent

Прошу прощения, совсем из головы вылетело. В своей программе быстрого выбора:
http://dwg.ru/dnl/2120
я проблему передачи объёкта в командную строку решил, не через Lisp, а через группу.
В случае с командой ExTrim этот вариан просто идеален.

Sub ExTrim()
Dim SelGroupObjs As AcadGroup
Dim ArrayObj(0) As AcadObject
Dim point(0 To 2) As Double
Dim coords(0 To 7) As Double
Dim plineRef As AcadLWPolyline
Dim sHandle As String
Dim sPoint As String
   point(0) = 10: point(1) = 10: point(2) = 0
   ThisDrawing.ModelSpace.AddCircle point, 10
   With ActiveDocument
      For Each SelGroupObjs In .Groups
         If SelGroupObjs.Name = "$$$EXTRIM" Then SelGroupObjs.Delete: Exit For
      Next SelGroupObjs
      Set SelGroupObjs = .Groups.Add("$$$EXTRIM")
   End With
   coords(0) = -10:    coords(1) = -10:    coords(2) = -10:    coords(3) = 10:
   coords(4) = 10:     coords(5) = 10:     coords(6) = 10:     coords(7) = -10:
   Set plineRef = ThisDrawing.ModelSpace.AddLightWeightPolyline(coords)
   plineRef.Closed = True
   Set ArrayObj(0) = plineRef
   SelGroupObjs.AppendItems ArrayObj
   sPoint = "0,20"
   ThisDrawing.SendCommand "_extrim" & vbCr & "_group" & vbCr & "$$$EXTRIM" & vbCr & sPoint & vbCr
   For Each GroupObj In ActiveDocument.Groups
      If GroupObj.Name = "$$$EXTRIM" Then GroupObj.Delete: Exit For
   Next GroupObj
   Set GroupObj = Nothing
End Sub

Re: Обрезание рамкой - SendCommand, extrim, handent

> Fatty

> rust2000
Кстати без sendcommand тут все-таки не обойтись.. В VBA вообще нет понятий extending или trimming.
Дословно из хелпа:

You can extend or trim an object by editing its properties

И приведен пример изменения координат линии в качестве ее удлинения:) Вот и все, что можно сделать в VBA))
Да эта проблема, по моему, уже муссировалась здесь как нерешаемая, потому и молчат местные корифеи.))

Re: Обрезание рамкой - SendCommand, extrim, handent

В общем же случае стрижку при помощи полилинии произвольной формы...

Для этого случая в команде Trim можно воспользоваться опцией _Fence

Re: Обрезание рамкой - SendCommand, extrim, handent

> Сидор Лютый

> Dron
Спасибо за исчерпывающее объяснение! Все отлично работает. А передачу в командную строку объектов через группу надо взять на вооружение.

Тут вместо handle указывается "L"

Из серии, а кто не понял, повторяю еще раз - это про меня, теперь понял, sorry.