Тема: LISP. Замена набора примитивов на выбранный примитив

Программа меняет набор примитивов на выбранный примитив.
Примеры применения:
Замена одних блоков другими.
Замена точек блоками или окружностями.
Замена одних надписей другими.

Сначала надо выбрать заменяемые объекты и нажать Enter, затем указать заменяющий объект. Вставка производится в центр ограничевающего (габаритного) прямоугольника старых объектов. Новые объекты вставляются в слои которые к которым пренадлежали старые объекты. Поддерживается предварительный выбор.

(defun c:frto(/ ACTDOC COPOBJ ERRCOUNT EXTLST
         EXTSET FROMCEN LAYCOL MAXPT CURLAY
         MINPT OBJLAY OKCOUNT OLAYST
         SCLAY TOCEN TOOBJ VLAOBJ *ERROR*)
  (vl-load-com)
  (defun *ERROR*(msg)
    (if olaySt
      (vla-put-Lock objLay olaySt)
      ); end if
    (vla-EndUndoMark actDoc)
    (princ)
    ); end of *ERROR*
  (defun GetBoundingCenter(vlaObj / blPt trPt cnPt)
  (vla-GetBoundingBox vlaObj 'minPt 'maxPt)
      (setq blPt(vlax-safearray->list minPt)
        trPt(vlax-safearray->list maxPt)
        cnPt(vlax-3D-point
          (list
              (+(car blPt)(/(-(car trPt)(car blPt))2))
              (+(cadr blPt)(/(-(cadr trPt)(cadr blPt))2))
           0.0
            ); end list
       ); end vlax-3D-point
      ); end setq
  ); end of GetBoundingCenter
  (if(not(setq extSet(ssget "_I")))
    (progn
      (princ "\n+++ Select distination objects and press Enter <- ")
      (setq extSet(ssget))
      ); end progn
    ); end if
  (if(not extSet)
    (princ "\nDistination objects isn't selected!")
    ); end if
  (if
    (and
    extSet
    (setq toObj(entsel "\n+++ Select source object -> "))
    ); and and
    (progn
      (setq actDoc
         (vla-get-ActiveDocument
           (vlax-get-Acad-object))
        layCol
         (vla-get-Layers actDoc)
        extLst
         (mapcar 'vlax-ename->vla-object
                    (vl-remove-if 'listp
                     (mapcar 'cadr(ssnamex extSet))))
        vlaObj(vlax-ename->vla-object(car toObj))
        objLay(vla-Item layCol
                (vla-get-Layer vlaObj))
        olaySt(vla-get-Lock objLay)
        fromCen(GetBoundingCenter vlaObj)
        errCount 0
        okCount 0
        ); end setq
      (vla-StartUndoMark actDoc)
      (foreach obj extLst
    (setq toCen(GetBoundingCenter obj)
          scLay(vla-Item layCol
                 (vla-get-Layer obj))
                 );end setq
    (if(/= :vlax-true(vla-get-Lock scLay))
      (progn
      (setq curLay(vla-get-Layer obj))
      (vla-put-Lock objLay :vlax-false)
      (setq copObj(vla-copy vlaObj))
      (vla-Move copObj fromCen toCen)
      (vla-put-Layer copObj curLay)
      (vla-put-Lock objLay olaySt)
      (vla-Delete obj)
      (setq okCount(1+ okCount))
      ); end progn
      (setq errCount(1+ errCount))
      ); end if
    ); end foreach
      (princ
    (strcat "\n" (itoa okCount) " were changed. "
        (if(/= 0 errCount)
          (strcat (itoa errCount) " were on locked layer! ")
          ""
          ); end if
        ); end strcat
    ); end princ
      (vla-EndUndoMark actDoc)
      ); end progn
    (princ "\nSource object isn't selected! ")
    ); end if
  (princ)
  ); end of c:frto

Re: LISP. Замена набора примитивов на выбранный примитив

Внешне выглядит так: объект-цель стирается, а на его место копируется объект-источник. Взял и текст заменил кругом, а зачем - не знаю.:)

Re: LISP. Замена набора примитивов на выбранный примитив

> Владимир Громов
Человеку который это просил на форуме, надо было заменить больше тысячи точек на окружности. А когда я это писал моему другу нужно было заменить около 2000 блоков 3 видов на другие блоки. Так что иногда очень полезно. А принцип, "любые объекты- на любые" для универсальности, мало ли кому чего надо...

Re: LISP. Замена набора примитивов на выбранный примитив

Классная штука !!! Очень нужная . Спасибо .

Re: LISP. Замена набора примитивов на выбранный примитив

Очень полезная вещь!!! А если нужно заменить блоки и сохранить старое значение поворота?

Re: LISP. Замена набора примитивов на выбранный примитив

С сохранением всех возможных свойств (углов поворота, масштабов, цвета, видимости и т.п.

(defun c:frto(/ ACTDOC COPOBJ ERRCOUNT EXTLST
       EXTSET FROMCEN LAYCOL MAXPT CURLAY
       MINPT OBJLAY OKCOUNT OLAYST
       SCLAY TOCEN TOOBJ VLAOBJ *ERROR*)
  (vl-load-com)
  (defun *ERROR*(msg)
    (if olaySt
      (vla-put-Lock objLay olaySt)
      ); end if
    (vla-EndUndoMark actDoc)
    (princ)
    ); end of *ERROR*
  (defun GetBoundingCenter(vlaObj / blPt trPt cnPt)
  (vla-GetBoundingBox vlaObj 'minPt 'maxPt)
      (setq blPt(vlax-safearray->list minPt)
      trPt(vlax-safearray->list maxPt)
      cnPt(vlax-3D-point
      (list
            (+(car blPt)(/(-(car trPt)(car blPt))2))
            (+(cadr blPt)(/(-(cadr trPt)(cadr blPt))2))
         0.0
            ); end list
     ); end vlax-3D-point
    ); end setq
  ); end of GetBoundingCenter
  (if(not(setq extSet(ssget "_I")))
    (progn
      (princ "\n+++ Select distination objects and press Enter <- ")
      (setq extSet(ssget))
      ); end progn
    ); end if
  (if(not extSet)
    (princ "\nDistination objects isn't selected!")
    ); end if
  (if
    (and
    extSet
    (setq toObj(entsel "\n+++ Select source object -> "))
    ); and and
    (progn
      (setq actDoc
       (vla-get-ActiveDocument
         (vlax-get-Acad-object))
      layCol
       (vla-get-Layers actDoc)
      extLst
       (mapcar 'vlax-ename->vla-object
                    (vl-remove-if 'listp
                     (mapcar 'cadr(ssnamex extSet))))
      vlaObj(vlax-ename->vla-object(car toObj))
      objLay(vla-Item layCol
          (vla-get-Layer vlaObj))
      olaySt(vla-get-Lock objLay)
      fromCen(GetBoundingCenter vlaObj)
      errCount 0
      okCount 0
      ); end setq
      (vla-StartUndoMark actDoc)
      (foreach obj extLst
  (setq toCen(GetBoundingCenter obj)
        scLay(vla-Item layCol
           (vla-get-Layer obj))
           );end setq
  (if(/= :vlax-true(vla-get-Lock scLay))
    (progn
    (setq curLay(vla-get-Layer obj))
    (vla-put-Lock objLay :vlax-false)
    (setq copObj(vla-copy vlaObj))
    (vla-Move copObj fromCen toCen)
;;;==> Исключили    (vla-put-Layer copObj curLay)
;;;==> Добавили
    (_kpblc-ent-properties-copy obj copObj)
    (vla-put-Lock objLay olaySt)
    (vla-Delete obj)
    (setq okCount(1+ okCount))
    ); end progn
    (setq errCount(1+ errCount))
    ); end if
  ); end foreach
      (princ
  (strcat "\n" (itoa okCount) " were changed. "
    (if(/= 0 errCount)
      (strcat (itoa errCount) " were on locked layer! ")
      ""
      ); end if
    ); end strcat
  ); end princ
      (vla-EndUndoMark actDoc)
      ); end progn
    (princ "\nSource object isn't selected! ")
    ); end if
  (princ)
  ); end of c:frto
;|=============================================================================
*    Функция копирования настроек примитивов
*    Параметры вызова:
*   source   примитив-источник (vla)
*   dest   примитив-получатель (vla)
*    Выполняется копирование всех настроек (кроме точек, координат и т.п.), если
* это возможно. Копирование радиусов дуг и окружностей не выполняется.
*    Контроль и преобразование параметров не выполняется.
*    Примеры вызова:
(_kpblc-ent-properties-copy (vlax-ename->vla-object (car (entsel))) (vlax-ename->vla-object (car (entsel))))
*    URL http://www.arcada.com.ua/forum/viewtopic.php?t=504&start=15
=============================================================================|;
(defun _kpblc-ent-properties-copy (source dest)
  (foreach prop   '("Angle"         "Layer"        "Linetype"
        "LinetypeScale"     "Lineweight"     "Normal"
        "PlotStyleName"     "Thickness"     "Color"
        "Visible"         "Closed"
                  ;|"ConstantWidth" ; не копируется|;
        "Elevation"         "LinetypeGeneration"
        "LinetypeScale" ;|"StartAngle" "EndAngle" ; не копируются|;
        "Alignment"         "Backward"     "Height"
        "ObliqueAngle"      "Rotation"     "ScaleFactor"
        "StyleName"         "TextGenerationFlag"
        "TextHeight"         "UpsideDown"     "AttachmentPoint"
        "BackgroundFill"    "DrawingDirection"  "LineSpacingDistance"
        "LineSpacingFactor" "LineSpacingStyle"  "Width"
        "XScaleFactor"      "YScaleFactor"     "ZScaleFactor"
     ; Viewport
        "ArcSmoothness"     "CustomScale"     "Direction"
        "DisplayLocked"     "GridOn"        "LensLength"
        "ModelView"         "ShadePlot"     "SheetView"
        "SnapBasePoint"     "SnapOn"        "SnapRotationAngle"
        "StandardScale"     "Target"        "TwistAngle"
        "UCSIconAtOrigin"   "UCSIconOn"     "UCSPerViewport"
        "ViewportOn"
        )
    (if   (and (vlax-property-available-p source prop)
        (vlax-property-available-p dest prop t)
        ) ;_ end of and
      (_kpblc-error-catch
   '(lambda ()
      (vlax-put-property dest prop (vlax-get-property source prop))
      ) ;_ end of LAMBDA
   nil
   ) ;_ end of _KPBLC-ERROR-CATCH
      ) ;_ end of if
    ) ;_ end of foreach
  ) ;_ end of defun
;|=============================================================================
*    Оболочка отлова ошибок.
*    Параметры вызова:
*   protected-function   - "защищаемая" функция
*   on-error-function   - функция, выполняемая в случае ошибки
*    URL http://www.arcada.com.ua/forum/viewtopic.php?t=504&start=15
=============================================================================|;
(defun _kpblc-error-catch
       (protected-function on-error-function / catch_error_result)
  (setq catch_error_result (vl-catch-all-apply protected-function))
  (if (and (vl-catch-all-error-p catch_error_result)
      on-error-function
      ) ;_ end of and
    (apply on-error-function
      (list (vl-catch-all-error-message catch_error_result))
      ) ;_ end of APPLY
    catch_error_result
    ) ;_ end of if
  ) ;_ end of defun

Re: LISP. Замена набора примитивов на выбранный примитив

> VVA
При работе с этой программой почему то блок который заменяется не удаляется?

Re: LISP. Замена набора примитивов на выбранный примитив

И эта программа, похоже, работает только в WCS!
И по интерфейсу: все-таки логичнее сначала выбрать источник, а уж потом объекты для замены.

Re: LISP. Замена набора примитивов на выбранный примитив

Наверное, надо просто добавить копирование свойства Normal, и этого будет достаточно.
---
ИМХО

Re: LISP. Замена набора примитивов на выбранный примитив

Только сейчас дошли руки (отпуск)

> KAI

> kpblc
В ф-ции GetBoundingCenter при получении точки центра для Z было 0.
Исправлено

> boban
Добавлен запрос на удаление

И по интерфейсу: все-таки логичнее сначала выбрать источник, а уж потом объекты для замены.

Я тоже так думаю

(defun c:frto(/ ACTDOC COPOBJ ERRCOUNT EXTLST
       EXTSET FROMCEN LAYCOL MAXPT CURLAY
       MINPT OBJLAY OKCOUNT OLAYST
       SCLAY TOCEN TOOBJ VLAOBJ *ERROR* ASK)
  (vl-load-com)
  (defun *ERROR*(msg)
    (if olaySt (vla-put-Lock objLay olaySt)); end if
    (vla-EndUndoMark actDoc)(princ)); end of *ERROR*
  (defun GetBoundingCenter(vlaObj / blPt trPt cnPt)
  (vla-GetBoundingBox vlaObj 'minPt 'maxPt)
      (setq blPt(vlax-safearray->list minPt)
      trPt(vlax-safearray->list maxPt)
      cnPt(vlax-3D-point
      (list
            (+(car blPt)(/(-(car trPt)(car blPt))2))
            (+(cadr blPt)(/(-(cadr trPt)(cadr blPt))2))
            (+(caddr blPt)(/(-(caddr trPt)(caddr blPt))2)) ;_<<< Заменили
            )))); end of GetBoundingCenter
  (setq extSet(ssget "_I"))
 (while (not (setq toObj(entsel "\n+++ Select source object -> ")))
   (princ "\nSource objects isn't selected!"))
  (if(not extSet)
    (progn
      (princ "\n+++ Select destination objects and press Enter <- ")
      (setq extSet(ssget "_:L")))); end if
  (if(not extSet)(princ "\nDestination objects isn't selected!")); end if
  (if (and extSet toObj)
    (progn
      (initget "Yes No")
      (setq ask (getkword "\nRemove source object [Yes/No] <No>:"))
      (setq actDoc (vla-get-ActiveDocument(vlax-get-Acad-object))
      layCol (vla-get-Layers actDoc)
      extLst (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp
                     (mapcar 'cadr(ssnamex extSet))))
      vlaObj (vlax-ename->vla-object(car toObj))
      objLay (vla-Item layCol (vla-get-Layer vlaObj))
      olaySt (vla-get-Lock objLay)
     fromCen (GetBoundingCenter vlaObj)
      errCount 0  okCount 0); end setq
      (vla-StartUndoMark actDoc)
      (foreach obj extLst
        (setq toCen (GetBoundingCenter obj)
              scLay (vla-Item layCol (vla-get-Layer obj)));end setq
  (if(/= :vlax-true(vla-get-Lock scLay))
    (progn
    (setq curLay(vla-get-Layer obj))
    (vla-put-Lock objLay :vlax-false)
    (setq copObj(vla-copy vlaObj))
    (vla-Move copObj fromCen toCen)
    (_kpblc-ent-properties-copy obj copObj)
    (vla-put-Layer copObj curLay)
    (vla-put-Lock objLay olaySt)
    (vla-Delete obj)
    (setq okCount(1+ okCount))
    ); end progn
    (setq errCount(1+ errCount))
    ); end if
  ); end foreach
      (princ (strcat "\n" (itoa okCount) " were changed. "
    (if(/= 0 errCount)(strcat (itoa errCount) " were on locked layer! ")  "")))
     (if (= ask "Yes")
     (if(/= :vlax-true(vla-get-Lock  objLay))
       (vla-Delete vlaObj)
       (princ "\nSource object on locked layer! ")))
      (vla-EndUndoMark actDoc)); end progn
    (princ "\nSource object isn't selected! ")
    ); end if
  (princ)); end of c:frto
;|=============================================================================
*    Функция копирования настроек примитивов
*    Параметры вызова:
*   source   примитив-источник (vla)
*   dest   примитив-получатель (vla)
*    Выполняется копирование всех настроек (кроме точек, координат и т.п.), если
* это возможно. Копирование радиусов дуг и окружностей не выполняется.
*    Контроль и преобразование параметров не выполняется.
*    Примеры вызова:
(_kpblc-ent-properties-copy (vlax-ename->vla-object (car (entsel))) (vlax-ename->vla-object (car (entsel))))
*    URL http://www.arcada.com.ua/forum/viewtopic.php?t=504&start=15
=============================================================================|;
(defun _kpblc-ent-properties-copy (source dest)
 (foreach prop   '("Angle" "Layer" "Linetype" "LinetypeScale" "Lineweight"
        "Normal" "PlotStyleName" "Thickness" "Color" "Visible"
        "Closed" ;|"ConstantWidth" ; не копируется|; "Elevation" "LinetypeGeneration"
        "LinetypeScale" ;|"StartAngle" "EndAngle" ; не копируются|; "Alignment"
        "Backward" "Height" "ObliqueAngle" "Rotation" "ScaleFactor" "StyleName"
        "TextGenerationFlag"  "TextHeight"  "UpsideDown"  "AttachmentPoint" "BackgroundFill"
        "DrawingDirection"  "LineSpacingDistance" "LineSpacingFactor" "LineSpacingStyle"  "Width"
        "XScaleFactor" "YScaleFactor" "ZScaleFactor" ;| Viewport|; "ArcSmoothness" "CustomScale"
        "Direction" "DisplayLocked"  "GridOn" "LensLength" "ModelView" "ShadePlot" "SheetView"
        "SnapBasePoint" "SnapOn" "SnapRotationAngle" "StandardScale" "Target"  "TwistAngle"
        "UCSIconAtOrigin"   "UCSIconOn"     "UCSPerViewport" "ViewportOn")
 (if (and (vlax-property-available-p source prop)(vlax-property-available-p dest prop t))
  (_kpblc-error-catch
    '(lambda ()(vlax-put-property dest prop (vlax-get-property source prop))) nil)))) ;_ end of defun
;|=============================================================================
*    Оболочка отлова ошибок.
*    Параметры вызова:
*   protected-function   — "защищаемая" функция
*   on-error-function   — функция, выполняемая в случае ошибки
*    URL http://www.arcada.com.ua/forum/viewtopic.php?t=504&start=15
=============================================================================|;
(defun _kpblc-error-catch
       (protected-function on-error-function / catch_error_result)
  (setq catch_error_result (vl-catch-all-apply protected-function))
  (if (and (vl-catch-all-error-p catch_error_result) on-error-function)
    (apply on-error-function
      (list (vl-catch-all-error-message catch_error_result)))
    catch_error_result)) ;_ end of defun

Re: LISP. Замена набора примитивов на выбранный примитив

> > VVA
1. На мой взгляд запрос на удаление источника - искуственный, гораздо было бы полезнее добавить запрос на удаление изменяемых объектов, причем по умолчанию - не удалять (контроль за работой программы иногда полезен).
2. Для объектов INSERT (и может быть TEXT, MTEXT и др.) желательно было-бы запрашивать у пользователя как вставлять: по точке вставки или по центру габарита объекта.
3. Что-то мне показалось, что для блоков с атрибутами центр окаймляющего прямоугольника вычисляются не совсем верно.
4. И вообще для такого рода программ очень полезнa была-бы опция Settings (по типу Matchprop), например, наследовать свойства источника, режим вставки и т.д..

Re: LISP. Замена набора примитивов на выбранный примитив

> KAI
1. Да, я не правильно понял предыдущие посты. Добавлен запрос на удаление изменяемых объектов

(defun c:frto(/ ACTDOC COPOBJ ERRCOUNT EXTLST
       EXTSET FROMCEN LAYCOL MAXPT CURLAY
       MINPT OBJLAY OKCOUNT OLAYST
       SCLAY TOCEN TOOBJ VLAOBJ *ERROR* ASK)
  (vl-load-com)
  (defun *ERROR*(msg)
    (if olaySt (vla-put-Lock objLay olaySt)); end if
    (vla-EndUndoMark actDoc)(princ)); end of *ERROR*
  (defun GetBoundingCenter(vlaObj / blPt trPt cnPt)
  (vla-GetBoundingBox vlaObj 'minPt 'maxPt)
      (setq blPt(vlax-safearray->list minPt)
      trPt(vlax-safearray->list maxPt)
      cnPt(vlax-3D-point
      (list
            (+(car blPt)(/(-(car trPt)(car blPt))2))
            (+(cadr blPt)(/(-(cadr trPt)(cadr blPt))2))
            (+(caddr blPt)(/(-(caddr trPt)(caddr blPt))2)) ;_<<< Заменили
            )))); end of GetBoundingCenter
  (setq extSet(ssget "_I"))
 (while (not (setq toObj(entsel "\n+++ Select source object -> ")))
   (princ "\nSource objects isn't selected!"))
  (if(not extSet)
    (progn
      (princ "\n+++ Select destination objects and press Enter <- ")
      (setq extSet(ssget "_:L")))); end if
  (if(not extSet)(princ "\nDestination objects isn't selected!")); end if
  (if (and extSet toObj)
    (progn
      (initget "Yes No")
      (setq ask (getkword "\nRemove destination object [Yes/No] <No>:"))
      (setq actDoc (vla-get-ActiveDocument(vlax-get-Acad-object))
      layCol (vla-get-Layers actDoc)
      extLst (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp
                     (mapcar 'cadr(ssnamex extSet))))
      vlaObj (vlax-ename->vla-object(car toObj))
      objLay (vla-Item layCol (vla-get-Layer vlaObj))
      olaySt (vla-get-Lock objLay)
     fromCen (GetBoundingCenter vlaObj)
      errCount 0  okCount 0); end setq
      (vla-StartUndoMark actDoc)
      (foreach obj extLst
        (setq toCen (GetBoundingCenter obj)
              scLay (vla-Item layCol (vla-get-Layer obj)));end setq
  (if(/= :vlax-true(vla-get-Lock scLay))
    (progn
    (setq curLay(vla-get-Layer obj))
    (vla-put-Lock objLay :vlax-false)
    (setq copObj(vla-copy vlaObj))
    (vla-Move copObj fromCen toCen)
    (_kpblc-ent-properties-copy obj copObj)
    (vla-put-Layer copObj curLay)
    (vla-put-Lock objLay olaySt)
    (if (= ask "Yes")(vla-Delete obj))
    (setq okCount(1+ okCount))
    ); end progn
    (setq errCount(1+ errCount))
    ); end if
  ); end foreach
      (princ (strcat "\n" (itoa okCount) " were changed. "
    (if(/= 0 errCount)(strcat (itoa errCount) " were on locked layer! ")  "")))
      (vla-EndUndoMark actDoc)); end progn
    (princ "\nSource object isn't selected! ")
    ); end if
  (princ)); end of c:frto

Ф-ции _kpblc-ent-properties-copy и _kpblc-error-catch брать из > VVA (2006-09-06 10:51:28)
По поводу п.2,4 требуется серьезная переработка программы. Может когда и дойдут руки.
По поводу п3. вполне возможно. Уже проскакивало на форумах про не всегда корректный результат vla-getBoundingBox. Например тут http://dwg.ru/forum/viewtopic.php?t=5631 и тут http://www.arcada.com.ua/forum/viewtopi … eb5950728c

Re: LISP. Замена набора примитивов на выбранный примитив

> VVA
А нет ли возможности, при замене блока оперировать не окаймляющим прямоугольником, а точкой вставки заменяемого блока?
Кроме того, возможна ли, в случае с блоком, пакетная замена, т.е. указание в командной строке(макросе) имени заменяемого блока и "нового" блока? При этом заменяемые блоки должны выбираться сплошь на чертеже.

Re: LISP. Замена набора примитивов на выбранный примитив

> iv
Тебе прямая дорога Express->Block->Replase Block with another block (blockreplace)

Re: LISP. Замена набора примитивов на выбранный примитив

> VVA
Мдяя... Ну и где ее учить, эту матчасть... :)
То что нужно!
А какого нибудь способа подружить его с ком.строкой нет?

Re: LISP. Замена набора примитивов на выбранный примитив

> iv
Напиши в командной строке:

-blockreplace

Re: LISP. Замена набора примитивов на выбранный примитив

> Владимир Громов
tvm :)
А як у командной строке делать проверку наличия заменяемого блока перед
-blockreplace;XXX;ZZZ;y  ??
А то сволочь на несуществующих блоках рвет скрипт :(

Re: LISP. Замена набора примитивов на выбранный примитив

Что то так и не понял как работает прога выбираю полилинию(могу выбрать токо 1  объект т.е. набор примитивов уже немогу выбрать) обвожу произвольный чертеж вставляется копия полилини рядом с другой полилинией (в центре описан прямоугольника) но эта полилиния не уничтожается. Или прога работает токо для блоков? а какже

""LISP. Замена набора примитивов на выбранный примитив"   А принцип, "любые объекты- на любые" для универсальности, мало ли кому чего надо..."

я почемуто подумал что прога должна запрашивать какой примитив(-Ы) искать в чертеже и на что заменять а дальше все(или не все) заменить(либо добавить) или ячето непонимаю

Re: LISP. Замена набора примитивов на выбранный примитив

> Syrex
Если ты про вариант > VVA (2006-09-07 10:12:26), то там внизу приписка

Ф-ции _kpblc-ent-properties-copy и _kpblc-error-catch брать из > VVA (2006-09-06 10:51:28)

Re: LISP. Замена набора примитивов на выбранный примитив

Нет я имел ввиду то что программу хотели более унивирсализировать а  если сделать чтобы программа по образцу сама искала что заменить.
Ну вот пример щас мне приходится работать со старыми чертежами там значки шероховатости по старому ГОСТ-у (набор 2 линий и текста) мне их надо поменять на новые обозначения (блок с атрибутом) так вот еслибы эта прога и сама отыскивала что заменять выделил токо 1 значек шероховатости показал на что заменить и все остальное сделала бы программа или программа не для этого создавалась? Гдето ведь видел прогу отыскивающие одинаковые примитивы
ЗЫ за прогу все равно БОЛЬШОЕ СпАсиБо!!

Re: LISP. Замена набора примитивов на выбранный примитив

Не удаляет заменяемый объект?

Re: LISP. Замена набора примитивов на выбранный примитив

заменяет только один блок и то не удаляет его

Re: LISP. Замена набора примитивов на выбранный примитив

> Tiristor
Это ты про какую программу? Там их много

Re: LISP. Замена набора примитивов на выбранный примитив

Наверное чего то не понял я, но мне показалось, что это одна программа, просто в процессе дискуссии были добавления и исправления, или нет? Интересует именно программа заменяющая определенные блоки на чертеже другим и удаляет старые. Вроде так. Скопировал последний код.

Re: LISP. Замена набора примитивов на выбранный примитив

> Tiristor
Я тоже скопировал последний, работает. Только к нему нужно кое-что докопировать с поста выше. Здесь собрал все

(defun c:frto(/ ACTDOC COPOBJ ERRCOUNT EXTLST
       EXTSET FROMCEN LAYCOL MAXPT CURLAY
       MINPT OBJLAY OKCOUNT OLAYST
       SCLAY TOCEN TOOBJ VLAOBJ *ERROR* ASK)
  (vl-load-com)
  (defun *ERROR*(msg)
    (if olaySt (vla-put-Lock objLay olaySt)); end if
    (vla-EndUndoMark actDoc)(princ)); end of *ERROR*
  (defun GetBoundingCenter(vlaObj / blPt trPt cnPt)
  (vla-GetBoundingBox vlaObj 'minPt 'maxPt)
      (setq blPt(vlax-safearray->list minPt)
      trPt(vlax-safearray->list maxPt)
      cnPt(vlax-3D-point
      (list
            (+(car blPt)(/(-(car trPt)(car blPt))2))
            (+(cadr blPt)(/(-(cadr trPt)(cadr blPt))2))
            (+(caddr blPt)(/(-(caddr trPt)(caddr blPt))2)) ;_<<< Заменили
            )))); end of GetBoundingCenter
  (setq extSet(ssget "_I"))
 (while (not (setq toObj(entsel "\n+++ Select source object -> ")))
   (princ "\nSource objects isn't selected!"))
  (if(not extSet)
    (progn
      (princ "\n+++ Select destination objects and press Enter <- ")
      (setq extSet(ssget "_:L")))); end if
  (if(not extSet)(princ "\nDestination objects isn't selected!")); end if
  (if (and extSet toObj)
    (progn
      (initget "Yes No")
      (setq ask (getkword "\nRemove destination object [Yes/No] <No>:"))
      (setq actDoc (vla-get-ActiveDocument(vlax-get-Acad-object))
      layCol (vla-get-Layers actDoc)
      extLst (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp
                     (mapcar 'cadr(ssnamex extSet))))
      vlaObj (vlax-ename->vla-object(car toObj))
      objLay (vla-Item layCol (vla-get-Layer vlaObj))
      olaySt (vla-get-Lock objLay)
     fromCen (GetBoundingCenter vlaObj)
      errCount 0  okCount 0); end setq
      (vla-StartUndoMark actDoc)
      (foreach obj extLst
        (setq toCen (GetBoundingCenter obj)
              scLay (vla-Item layCol (vla-get-Layer obj)));end setq
  (if(/= :vlax-true(vla-get-Lock scLay))
    (progn
    (setq curLay(vla-get-Layer obj))
    (vla-put-Lock objLay :vlax-false)
    (setq copObj(vla-copy vlaObj))
    (vla-Move copObj fromCen toCen)
    (_kpblc-ent-properties-copy obj copObj)
    (vla-put-Layer copObj curLay)
    (vla-put-Lock objLay olaySt)
    (if (= ask "Yes")(vla-Delete obj))
    (setq okCount(1+ okCount))
    ); end progn
    (setq errCount(1+ errCount))
    ); end if
  ); end foreach
      (princ (strcat "\n" (itoa okCount) " were changed. "
    (if(/= 0 errCount)(strcat (itoa errCount) " were on locked layer! ")  "")))
      (vla-EndUndoMark actDoc)); end progn
    (princ "\nSource object isn't selected! ")
    ); end if
  (princ)); end of c:frto
;|=============================================================================
*    Функция копирования настроек примитивов
*    Параметры вызова:
*   source   примитив-источник (vla)
*   dest   примитив-получатель (vla)
*    Выполняется копирование всех настроек (кроме точек, координат и т.п.), если
* это возможно. Копирование радиусов дуг и окружностей не выполняется.
*    Контроль и преобразование параметров не выполняется.
*    Примеры вызова:
(_kpblc-ent-properties-copy (vlax-ename->vla-object (car (entsel))) (vlax-ename->vla-object (car (entsel))))
*    URL http://www.arcada.com.ua/forum/viewtopic.php?t=504&start=15
=============================================================================|;
(defun _kpblc-ent-properties-copy (source dest)
 (foreach prop   '("Angle" "Layer" "Linetype" "LinetypeScale" "Lineweight"
        "Normal" "PlotStyleName" "Thickness" "Color" "Visible"
        "Closed" ;|"ConstantWidth" ; не копируется|; "Elevation" "LinetypeGeneration"
        "LinetypeScale" ;|"StartAngle" "EndAngle" ; не копируются|; "Alignment"
        "Backward" "Height" "ObliqueAngle" "Rotation" "ScaleFactor" "StyleName"
        "TextGenerationFlag"  "TextHeight"  "UpsideDown"  "AttachmentPoint" "BackgroundFill"
        "DrawingDirection"  "LineSpacingDistance" "LineSpacingFactor" "LineSpacingStyle"  "Width"
        "XScaleFactor" "YScaleFactor" "ZScaleFactor" ;| Viewport|; "ArcSmoothness" "CustomScale"
        "Direction" "DisplayLocked"  "GridOn" "LensLength" "ModelView" "ShadePlot" "SheetView"
        "SnapBasePoint" "SnapOn" "SnapRotationAngle" "StandardScale" "Target"  "TwistAngle"
        "UCSIconAtOrigin"   "UCSIconOn"     "UCSPerViewport" "ViewportOn")
 (if (and (vlax-property-available-p source prop)(vlax-property-available-p dest prop t))
  (_kpblc-error-catch
    '(lambda ()(vlax-put-property dest prop (vlax-get-property source prop))) nil)))) ;_ end of defun
;|=============================================================================
*    Оболочка отлова ошибок.
*    Параметры вызова:
*   protected-function   — "защищаемая" функция
*   on-error-function   — функция, выполняемая в случае ошибки
*    URL http://www.arcada.com.ua/forum/viewtopic.php?t=504&start=15
=============================================================================|;
(defun _kpblc-error-catch
       (protected-function on-error-function / catch_error_result)
  (setq catch_error_result (vl-catch-all-apply protected-function))
  (if (and (vl-catch-all-error-p catch_error_result) on-error-function)
    (apply on-error-function
      (list (vl-catch-all-error-message catch_error_result)))
    catch_error_result)) ;_ end of defun
(princ "\nType FRTO in command line")