Не могу перерисовать объект

Автор Тема: Не могу перерисовать объект  (Прочитано 6266 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн zavorАвтор темы

  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
Всем привет. У меня такая проблема. Мне нужно в autocad перерисовать полилинию. Делаю я это с помощью функции entmod. Сначала я удаляю старые вершины, потом добавляю новые. Но полилиния не перерисовывается, хотя вершины добавляются.  Но если нажать на полиниию и задать действие обратить, тогда линия нормально перерисовывается. Привожу код ниже с результатами его выполнения.
(entmod (append (vl-remove nil (mapcar '(lambda (x) (if (or (/= 10 (car x) (/= 90 (car x)))) x)) (entget(handent (cdr(nth 12 QPrim))))))
                  (list
                        ;(cons 62 7)
                   (cons 90 10)
                   (cons 10 ACoord)
                  
                   (cons 10 (list (car ACoord) (- (cadr ACoord) (* 0.72 K))))
                  
                   (cons 10 (list (+ (* 0.62 K) (car ACoord)) (- (cadr ACoord) (* 0.72 K))))
                  
                   (cons 10 (list (+ (* 0.62 K) (car ACoord)) (cadr ACoord)))

                   (cons 10 (list (+ (* 1.24 K) (car ACoord)) (cadr ACoord)))

                   (cons 10 (list (+ (* 1.24 K) (car ACoord)) (- (cadr ACoord) (* 0.36 K))))

                   (cons 10 (list (car ACoord) (- (cadr ACoord) (* 0.36 K))))

                   (cons 10 (list (car ACoord) (- (cadr ACoord) (* 0.72 K))))

                   (cons 10 (list (+ (* 1.24 K) (car ACoord)) (- (cadr ACoord) (* 0.72 K))))

                   (cons 10 (list (+ (* 1.24 K) (car ACoord)) (cadr ACoord)))

                   (cons 10 ACoord)
            
                  )
            )
         )

На рисунке рамки нет


Задаем параметр обратить


и рамка прорисовывается через все вершины



Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не могу перерисовать объект
« Ответ #1 : 31-10-2015, 12:32:46 »
zavor
1) Прочитай у меня в подписи как следует форматировать код для форума и исправь в своём сообщении.
2) Показан не код, а обрывок кода, который нельзя запустить для проверки. Не ленись делать нормальный тестовый код.
3) Если после обращения полилиния становится видимой, то сделай два обращения. Затем сделай (entget) для результирующей полилинии и сравни результаты выполнения этой функции с результатом твоего (entmod). Возможно не хватает некоторых групп:
Цитировать
Command: (entget(car(entsel)))
Select object: ((-1 . <Entity name: 7ffffb07040>) (0 . "LWPOLYLINE") (330 . <Entity name: 7ffffb039f0>) (5 . "28C") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPolyline") (90 . 7) (70 . 0) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 1962.61 922.315) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 1962.61 1469.21) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 2094.19 1469.21) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 2094.19 1274.96) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 2282.58 1274.96) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 2282.58 1056.8) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 2133.06 1056.8) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (210 0.0 0.0 1.0))
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Не могу перерисовать объект
« Ответ #2 : 31-10-2015, 13:05:25 »
Автолисп конечно многое прощает в плане небрежности кода - на других API автокада - подобный код неминуемо привел-бы к фаталу - а у Вас он просто не работает:
Вы если "чистите" dxf список полилинии от вершин - то делайте это для всех кодов вершин, а не только для 10-го, наверное это правильней сделать для всех кодов от первой dxf 10 до dxf 210 - иначе жди чего угодно - в любой момент времени работы с данной полилинией.
з.ы. связку (vl-remove nil (mapcar ....)) лучше заменить на (vl-removie-if[-not]... )
ООООООООООООПС - слона то я и не заметил - (or (/= 10 (car x) (/= 90 (car x)))) - это что должно делать??