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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Ошибка "invalid input" при изменении свойств динамического блока

Ошибка "invalid input" при изменении свойств динамического блока

Ответ
Поиск в этой теме
Непрочитано 03.12.2009, 17:07 #1
Ошибка "invalid input" при изменении свойств динамического блока
ArvI
 
Регистрация: 01.12.2009
Сообщений: 7

всем привет.
поискал в сети - ничего не нашел.
а проблема такая: пишу прогу в delphi2007, она должна в открытом документе найти нужный динамический блок, и поменять значение свойства. код ниже. Смотря в отладчике - падает с "invalid input" на присвоении значению свойства нового значения. чтение проходит нормально. readonly стоит в false. Эта ошибка появлялась на 3 разных машинах с разными Автокадами.
Подскажите как исправить или может как обойти проблему.
Спасибо.

Код:
[Выделить все]
procedure procname;
var i,co: integer;
    Acad: OleVariant;
    bp,yi: olevariant;
    zxc: IAcadBlockReference;
    ccv: IAcadDynamicBlockReferenceProperty;
begin
  Acad:=GetActiveOleObject('AutoCAD.Application'); //проверяем запущен ли AutoCAD
  co:=Acad.activedocument.modelspace.count;
  for i:=0 to co-1 do begin
    s:=acad.activedocument.modelspace.item(i).objectname;
    if s='AcDbBlockReference' then begin
      if acad.activedocument.modelspace.item(i).EffectiveName='bruk' then begin
  zxc:=IDispatch(acad.activedocument.modelspace.item(i)) as IAcadBlockReference;
  bp:=zxc.GetDynamicBlockProperties;
  ccv:=IDispatch(bp[0]) as IAcadDynamicBlockReferenceProperty;
  ccv.Value:=yi;
 end;
 end;
end;

Последний раз редактировалось Кулик Алексей aka kpblc, 03.12.2009 в 22:20.
Просмотров: 5267
 
Непрочитано 03.12.2009, 18:17
#2
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


А! Дык зачем в моделспейс полез? Там ведь только вхождения. Как они тебе эффективное имя поменяют? Или ты не эффективное имя менять собрался?
Если надо эффективное имя поменять, то надо лезть в коллекцию blocks и там менять.
Supermax вне форума  
 
Непрочитано 03.12.2009, 22:23
#3
Кулик Алексей aka kpblc
Moderator

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


ArvI, по идее это может зависеть от того, является свойство "перечисляемым" или нет (Allowed). Как бы то ни было, в отладчике проверяй тип значений для каждого динамического свойства. По-моему, у тебя элементарное несовпадение типов.
Supermax, топикстартер все верно делает, просмотри код внимательнее Мне так каэцца
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 07.12.2009, 16:54
#4
ArvI


 
Регистрация: 01.12.2009
Сообщений: 7


Алексей, я тоже думал на типы.
В этом динамическом блоке я использую параметр Polar Parameter.
Как известно у него два значения: Dist и Ang, т.е. расстояние и угол.
Когда выбираю Dist type, то там в списке 3 варианта типа: none, increment и list.
Так вот: задавая типы none или increment, свойство блока AllowedValues не содержит ничего и падения программы продолжаются, а задавая тип list - оно содержит естесственно тот самый список и тогда вот такое завершение вышенаписанной процедуры
Код:
[Выделить все]
ccv.Value:=ccv.AllowedValues[0]
не вызывает никаких падений и все работает путем.
но проблема не решена.
есть идеи?
ArvI вне форума  
 
Непрочитано 07.12.2009, 22:00
#5
Кулик Алексей aka kpblc
Moderator

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


Стоп, none - это "пусто"; increment - "прирастающее", т.е. true или false. Или нет? Ииииех, образец бы...
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 07.12.2009, 23:06
#6
ArvI


 
Регистрация: 01.12.2009
Сообщений: 7


образец файл .dwg выложу завтра. в хелпе написано: свойство allowedvalues используется только для типа List. для двух других типов оно не испольлзуется.
ArvI вне форума  
 
Автор темы   Непрочитано 12.12.2009, 00:16
#7
ArvI


 
Регистрация: 01.12.2009
Сообщений: 7


извиняюсь за тормоза - конец года, работу надо сдавать, дел много.
вот dwg - www.mineframe.ru/b/attrib_block.dwg
этот чертеж как пример
могу выложить свой код целиком, чтоб кто-то попробовал - вдруг у кого-то пойдет, там например в винде или автокаде дело. )) (что мало вероятно)
ArvI вне форума  
 
Непрочитано 12.12.2009, 01:06
#8
Кулик Алексей aka kpblc
Moderator

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


Я не спец по Delphi ни разу, но для VB(A) подобное было бы нечто типа:
Код:
[Выделить все]
Public Sub test()
Dim ent As AcadEntity, BlockRef As AcadBlockReference, point As Variant
  ThisDrawing.Utility.GetEntity ent, point
  If ent.ObjectName = "AcDbBlockReference" Then
    Set BlockRef = ent
    If BlockRef.IsDynamicBlock Then
      Dim arDynBlockProp As Variant
      arDynBlockProp = BlockRef.GetDynamicBlockProperties
      Dim enumBlockProp As Integer, NewValue As Double
      NewValue = 100
      For enumBlockProp = LBound(arDynBlockProp) To UBound(arDynBlockProp)
        If LCase(arDynBlockProp(enumBlockProp).PropertyName) = "distance1" Then
          arDynBlockProp(enumBlockProp).Value = NewValue
          BlockRef.Update
          Exit For
        End If
      Next enumBlockProp
    End If
  End If
End Sub
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.12.2009, 16:02
#9
ArvI


 
Регистрация: 01.12.2009
Сообщений: 7


согласен по коду.
возьми,пожалуйста, мой dwg и попробуй на своем коде в VB
будет ли работать...
ArvI вне форума  
 
Непрочитано 12.12.2009, 16:16
#10
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от ArvI Посмотреть сообщение
согласен по коду.
возьми,пожалуйста, мой dwg и попробуй на своем коде в VB
будет ли работать...
На твоем чертеже работает (VBA):
Код:
[Выделить все]
Option Explicit

Sub ChangeDynBlocksEntireDWG()
' tested on A2008 only
     Dim ss As AcadSelectionSet
     Dim ent As AcadEntity
     Dim bname As String
     bname = "bruk"
     Dim pvalue As Variant
     Dim blkRef As AcadBlockReference
     With ThisDrawing.SelectionSets
          While .Count > 0
               .Item(0).Delete
          Wend
          Set ss = .Add("$DynBlocks$")
     End With

     Dim ftype(2) As Integer
     Dim fdata(2) As Variant
     pvalue = 25.4 ''<--change distance value here
     ftype(0) = 0: ftype(1) = 2: ftype(2) = 67
     fdata(0) = "INSERT": fdata(1) = "`*U#*" & "," & bname: fdata(2) = 0 
     ss.Select acSelectionSetAll, , , ftype, fdata '<--выбираем все блоки
  If ss.Count > 0 Then
  MsgBox ss.Count
  For Each ent In ss
  Set blkRef = ent
  If blkRef.IsDynamicBlock Then
  If blkRef.EffectiveName = bname Then
  Dim props() As AcadDynamicBlockReferenceProperty
  Dim i As Integer
  props = blkRef.GetDynamicBlockProperties
  Dim prop As AcadDynamicBlockReferenceProperty
For i = LBound(props) To UBound(props)
Set prop = props(i)
If prop.PropertyName = "Distance" Then 
prop.Value = pvalue '<-- новое значение для Distance
End If
Next i
End If
End If
Next ent
End If
     
ss.Delete '<--optional

End Sub
~'J'~

Последний раз редактировалось Олег (jr.), 12.12.2009 в 16:18. Причина: добавлены комментарии
Олег (jr.) вне форума  
 
Непрочитано 12.12.2009, 22:52
#11
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от ArvI Посмотреть сообщение
согласен по коду.
возьми,пожалуйста, мой dwg и попробуй на своем коде в VB
будет ли работать...
Я именно на твоем файле и проверял.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.12.2009, 12:16
#12
ArvI


 
Регистрация: 01.12.2009
Сообщений: 7


вот выложил exe свой. www.mineframe.ru/b/project.zip
dwg рядом лежит www.mineframe.ru/b/attrib_block.dwg
для работы программы в автокаде этот dwg должен быть активным.
попробуйте кому не лень. )))
Алексей, может дашь мне свою прогу попробовать у себя
или расскажи как твой код скомпилить. я с VB как то не особо дружу.

Последний раз редактировалось ArvI, 16.12.2009 в 12:23.
ArvI вне форума  
 
Непрочитано 16.12.2009, 12:47
#13
Кулик Алексей aka kpblc
Moderator

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


Так это не VB, а VBA. Код для VB будет аналогичен, только добавлять надо объявления и инициализацию указателей на приложение и активный документ (который ThisDrawing). Если бы я знал Deplhi, я бы сразу код рабочий рисовал
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.12.2009, 14:13
#14
ArvI


 
Регистрация: 01.12.2009
Сообщений: 7


все.
разобрался.
если у тебя в коде вот в этой строчке
Код:
[Выделить все]
pvalue = 25.4 ''<--change distance value here
заменить 25.4 на 25 то тоже "invalid input"
но, с другой стороны, поле-то все равно целочисленное и приводится к 25.

Алексей, спасибо.

буду чаще захаживать на форум

Последний раз редактировалось ArvI, 16.12.2009 в 15:11.
ArvI вне форума  
 
Непрочитано 17.12.2009, 00:31
#15
Кулик Алексей aka kpblc
Moderator

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


А если ставить не а
Ну или с объявлениями типов разобраться
P.S. Скажу честно - голова сейчас не работает ни разу
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Ошибка "invalid input" при изменении свойств динамического блока

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Назначение свойств атрибутов блока без attsync Кулик Алексей aka kpblc Программирование 9 15.08.2017 06:32
Мониторы LCD CRT Разное 94 17.06.2008 10:51
БРЕД СИВОЙ КОБЫЛЫ Kryaker Разное 1876 29.12.2006 23:41
Есть ли возможность при вставке блока разрывать линии Незнайка AutoCAD 13 03.04.2006 20:34