| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA, "повесить блок на курсор"

VBA, "повесить блок на курсор"

Ответ
Поиск в этой теме
Непрочитано 30.07.2008, 12:57 #1
VBA, "повесить блок на курсор"
Vildar
 
AutoCAD
 
Москва
Регистрация: 26.07.2007
Сообщений: 1,064

Задачка такая обресовалась

При вставке блока с кнопки, запросить точку вставки и одновременно "повесить" его на курсор (и чтоб он за курсором перемещался).
Причем, отображаться он должен в заданном масштабе

Какая будет стратегия.

Последний раз редактировалось Vildar, 30.07.2008 в 13:08.
Просмотров: 7896
 
Автор темы   Непрочитано 30.07.2008, 13:01
#2
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Самое главное забыл. После указания точки, нужно еще проследить за мышкой и в раные стороны блок поворачивать. Ну например высотную отметку.
Vildar вне форума  
 
Непрочитано 30.07.2008, 13:12
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


http://dwg.ru/f/showthread.php?t=11905 - там есть лисповые решения. Это тот случай, когда от командных методов отказаться невозможно.
Я понимаю, что "задели" невозможности VBA в теме "VBA - зло"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.07.2008, 15:15
#4
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
http://dwg.ru/f/showthread.php?t=11905Это тот случай, когда от командных методов отказаться невозможно.)
А здесь?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 30.07.2008, 15:20
#5
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Дима_, а если вспомнить BricsCAD и Ко? Там ET нет и не будет
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.07.2008, 16:11
#6
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


А жаль! В чем же интересно у самих автодесков это (прорисовка тела у курсора) написанно? Вопрос у кого голый автокад без ET - там при перемещении тела оно у курсора наблюдаеться?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 30.07.2008, 16:17
#7
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от Vildar Посмотреть сообщение
Задачка такая обресовалась

При вставке блока с кнопки, запросить точку вставки и одновременно "повесить" его на курсор (и чтоб он за курсором перемещался).
Причем, отображаться он должен в заданном масштабе

Какая будет стратегия.
Объектными методами в VBA это не реализовать
Можно только с использованием лисп выражения
и функции SendCommand:

Код:
[Выделить все]
Option Explicit

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
Function IsBlockExist(bName As String) As Boolean

   Dim oBlock As AcadBlock
   IsBlockExist = False
   For Each oBlock In ThisDrawing.Blocks
   If StrComp(oBlock.Name, bName, vbTextCompare) = 0 Then
   IsBlockExist = True
   End If
   Next

End Function
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
Function IsLayerExist(lName As String) As Boolean

   Dim oLayer As AcadLayer
   IsLayerExist = False
   For Each oLayer In ThisDrawing.Layers
   If StrComp(oLayer.Name, lName, vbTextCompare) = 0 Then
   IsLayerExist = True
   End If
   Next

End Function
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
Sub InsertWithGhostImage()

     Dim blkName As String, layName As String

     Dim strPt As String, comStr As String

     blkName = InputBox(vbCrLf & "Block name to insert:", "Insert Block")

     If blkName = vbNullString Then Exit Sub

     If Not IsBlockExist(blkName) Then
     MsgBox "Block " & Chr(34) & blkName & Chr(34) & " does not exist"
     Exit Sub
     End If

     layName = InputBox(vbCrLf & "Layer name to insert block on:", "Insert Block", "0")

     If Not IsLayerExist(layName) Then
     MsgBox "Layer " & Chr(34) & layName & Chr(34) & " does not exist"
     Exit Sub
     End If

     With ThisDrawing

          On Error GoTo Err_Control
          .Utility.Prompt vbCrLf & "   Specify insertion point of block  >>"
          comStr = "(command " & _
                   Chr(34) & "._-insert" & Chr(34) & _
                   vbCr & Chr(34) & blkName & _
                   Chr(34) & " pause " & vbCr & _
                   Chr(34) & "1" & Chr(34) & _
                   vbCr & Chr(34) & "1" & Chr(34) & _
                   vbCr & Chr(34) & "0" & Chr(34) & ")"
                   .SendCommand comStr & vbCr

          DoEvents

          Dim oSpace As AcadBlock
          Dim oblkRef As AcadBlockReference
          If .ActiveSpace = acModelSpace Then
               Set oSpace = .ModelSpace
          Else
               Set oSpace = .PaperSpace
          End If
          Set oblkRef = oSpace.Item(oSpace.Count - 1)

     End With

Exit_Here:

     Exit Sub

Err_Control:

     MsgBox Err.Description
     Resume Exit_Here

End Sub
~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 30.07.2008, 16:30
#8
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Цитата:
Сообщение от Дима_ Посмотреть сообщение
А жаль! В чем же интересно у самих автодесков это (прорисовка тела у курсора) написанно? Вопрос у кого голый автокад без ET - там при перемещении тела оно у курсора наблюдаеться?
Попробоввал на 2008 LT без експрессов. Вставил блок, причем с атрибутом. До указания точки вставки, при перемещении мышки по экрану, блок перемещается (перерисовывается), с задержкой в отрисовке текста.
Vildar вне форума  
 
Непрочитано 30.07.2008, 16:47
#9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


В LT вообще Express Tools существовать не могут (официально)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.07.2008, 17:05
#10
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Тогда значит они (Аутодеск) от нас что-то скрывают, надо на них VVA натравить чтобы, он эту недокументированную функцию отрыл.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 30.07.2008, 18:59
#11
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


fixo, мне кажется Вы недописали, после:
Код:
[Выделить все]
Set oblkRef = oSpace.Item(oSpace.Count - 1)
Что означает? И после ничего нет!?
Насчет DoEvents, поясните. В справке непонятно написано.
Во время паузы в:
Код:
[Выделить все]
"(command "._-insert" "СЛ2" pause "1" "1" "0")"
Выполняется DoEvents? Так?
Вернее не выполняется, а может выполняться еще одна команда.
Хотя нет. Во время "pause", запрвшивается точка вставки. Тогда вообще непонятно. Вы извените за глупые вопросы, ладно.
Ё, я кажется понял. Вставка блока через команду, это оно самое и есть. Т.е. блок (с помощью Автокада) вешается на курсор? Футы, так просто.
А как насчет реализации после указания точки вставки блока. Нужно управлять его размещением, в зависимости от расположения курсора относительно точки вставки.

Последний раз редактировалось Vildar, 30.07.2008 в 19:34.
Vildar вне форума  
 
Непрочитано 30.07.2008, 20:10
#12
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Опять же на VBA это не сделать
Но можно тупо вставлять блок куда-нибудь
скажем в точку 0,0,0 а затем по аналогии
использовать команду "Move" через SendCommand
Так на языке и вертится: через ж..
Насчет DoEvents в данном контексте она
не выполняет никакой роли можешь убрать
А в принципе эта функция передает управление Windows,
для обработки других событий. И после обработки Windows'ом всех событий из очереди и передачи всех нажатий клавиш из очереди функции SendKeys возвращает управление обратно в VBA
Фактически здесь она работает как Sleep

~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 31.07.2008, 09:37
#13
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


А что значит - "~'J'~"? Где-то (на caduser кажись) уже встречал!

Не совсем понял про "через жо...": Но можно тупо вставлять блок куда-нибудь скажем в точку 0,0,0 а затем по аналогии
использовать команду "Move" через SendCommand

Если есть возможность, посмотрите как вставляется, например, высотная отметка в СПДС. На мой взгляд, только move не обойтись.
Ну ладно, для меня пока это не критично (проблема остро не стоит).
Vildar вне форума  
 
Непрочитано 31.07.2008, 09:42
#14
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


я бы использовал не _.move, а либо _.change (для варианта 2Д), либо _.-insert (для варианта 3Д)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.07.2008, 11:09
#15
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от Vildar Посмотреть сообщение
А что значит - "~'J'~"? Где-то (на caduser кажись) уже встречал!
Это означает мою глупую рожу -
глаза, нос и усы

~'J'~
fixo вне форума  
 
Непрочитано 31.07.2008, 11:19
#16
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Код:
[Выделить все]
(command "._-insert" "СЛ2" pause "1" "1" "0")"
Это ведь не VBA. Это LISP, отправленный в командную строку средствами VBA. Но "там же скобки"!

Далее. Эта строка будет отображаться в командной строке AutoCAD. Кому этот мусор нужен?

А почему стоит "1"? Разве блок только в единичном масштабе вставляется? Масштаб должен быть рассчитан в зависимости от назначения блока, а блок перед вставкой должен быть смасштабирован. Что толку, если на курсоре будет болтаться какая-то козявка или наоборот, громадина?

А поворот обязательно 0? А если надо еще и разворачивать (или визуально или с заданием угла любым стандартным методом), что другой проект делать?

А если атрибуты в блоке будут? Че тогда?

А откуда вообще имя блока будет браться? Спрашивать, как показано в #7? Или зашивать в dvb? А если блоков сотни? Что, на каждый блок проект?

А как в меню записать?

А если определения блока нет в DWG? Exit Sub и всё?

и т.д.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 31.07.2008, 11:50
#17
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Это просто "чайнику" показали, как использовать командные методы при вставке блока.
По замечаниям от ShaggyDoc. Мои предположения. Остальные условия тоже можно туда прописать.
- Имя блока берем с кнопки (через сис.переменную Userr1), проверяем его наличие. Кнопка, потому что блоков оформления не много, я делаю именно их.
- Масштаб, у меня он в сис.переменной CELTSCALE (и формочка в немодальном режиме для изменения масштаба).
- Дальше черт его знает.

Пока у меня на кнопке макрокоманда, из книжки В.Свет, по простому варианту: ^C^C_-insert;Os;\$M=$(Getvar,CELTSCALE);;;
Значение атрибута - ручками .
И повернут/подвинут/отзеркалят если надо тоже ручками )))

Серьезно. Надо решать поставленные задачи. Это я себе говорю, че-то обленился.
Vildar вне форума  
 
Автор темы   Непрочитано 31.07.2008, 13:20
#18
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Подскажите переменную для регулирования масштаба отображаемого на курсоре блока.
Vildar вне форума  
 
Непрочитано 31.07.2008, 13:25
#19
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Такой переменной нет. Прочти ссылку, которую я давал - там ShaggyDoc все по полочкам разложил
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.07.2008, 14:06
#20
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Читал, читаю. В постах нашел INSUNITS. Но это же не то (жесткая градация единиц чертежа). А в лисповом коде мне не разлбраться.
Пояснение. По INSUNITS, я имею ввиду что она управляет масштабом, но ее значения ограничены.
Vildar вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA, "повесить блок на курсор"

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хитрый блок Vova Динамические блоки 166 20.03.2017 15:13
Пароль к VBA karp_b Программирование 24 29.08.2013 12:43
Как удалить существующий блок? dextron3 Динамические блоки 21 24.12.2012 10:19
Помогите доделать программу добавления объектов в блок МишаVBA Программирование 1 20.05.2006 01:04