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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Работа со слоями - преодоление бага GstarCAD

Работа со слоями - преодоление бага GstarCAD

Ответ
Поиск в этой теме
Непрочитано 18.07.2014, 09:47 #1
Работа со слоями - преодоление бага GstarCAD
inwar
 
Регистрация: 15.11.2010
Сообщений: 14

Добрый день, Уважаемые!
Контора сидит на GstarCAD'е...
Начали осваивать параллельное проектирования методом внешних ссылок и сразу уткнулись в проблему: GstarCAD, сволочь такая, не запоминает отключенные слои внешних ссылок при сохранении чертежа. То есть у него в настройках есть галочка "сохранять состояние слоев ссылок", но она не работает по факту. Иные методы тоже не дали результата: ни попытки создать групповые фильтры, ни создание файлов конфигураций слоев. То есть они работают, но только со слоями внутри файла, не ссылочными.
Как вы понимаете, если каждый раз при открытии файла надо будет заново отключать много ссылочных слоев - все потуги сделать параллельную работу комфортной для проектировщиков обречены на провал.
Собственно, надежда у меня осталась только на программное решение данной проблемы.
Есть такая зацепка:

Код:
[Выделить все]
Sub LayerInvisble() 
  Dim circleObj As GcadCircle 
  Dim center(0 To 2) As Double 
  Dim radius As Double 
  center(0) = 2: center(1) = 2: center(2) = 0: radius = 1 
  Set circleObj = thisDrawing.ModelSpace.AddCircle(center, radius) 
  circleObj.color = acByLayer 

  Dim layerObj As GcadLayer 
  Set layerObj = thisDrawing.Layers.Add("П. Осипенко, 56а|ЗДАНИЯ_И_СООРУЖЕНИЯ") 
  ' layerObj.color = acRed 

  ' circleObj.Layer = "ABC" 
  circleObj.Layer = "П. Осипенко, 56а|ЗДАНИЯ_И_СООРУЖЕНИЯ" 
   
  circleObj.Update 

  layerObj.LayerOn = False 
  thisDrawing.Regen acActiveViewport 
End Sub
Результат, который я сейчас имею - макрос отключает 1 ссылочный слой. Остается задача: запомнить отключенные слои (экспортировать в файл?) и восстановить их состояние (т.е. отключить) при повторной загрузке файла. в принципе, нормально будет если это будет выполняться не при загрузке чертежа, а по кнопке (запуск макроса).

Есть ли решение этой задачи?
Просмотров: 4138
 
Непрочитано 18.07.2014, 10:22
#2
Кулик Алексей aka kpblc
Moderator

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


А GStartCAD нет никакого аналога VISRETAIN?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.07.2014, 10:44
#3
inwar


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


Конечно есть.
(там вообще заявлены все автокадные системные переменные).
И у меня она включена (1)
Вот только один фиг - после "переоткрытия" файла снова включаются все ссылочные слои...
inwar вне форума  
 
Непрочитано 18.07.2014, 16:09
#4
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


К разработчикам обращаться пробовали?
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 18.07.2014, 16:24
#5
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 190
Отправить сообщение для nolte с помощью Skype™


глючная это система gstarcad в плане программирования. я пробовал чего то сотворить совсем незайтелевое, но безрезультатно и к разработчикам обращался и справку смотрел, все без толку. получил благодарность от разработчиков за выявленный баг и ответ что будет исправлен в следующих версиях программы. к примеру функция (getstring T "\nlkj") в справке описана нормально, разрешает пробелы, а на деле не работает и еще несколько функций auto/visual lisp, которыми пользовался, вообще не работали, то есть gstarcad их просто не знал.
__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума  
 
Непрочитано 18.07.2014, 19:00
#6
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,437
Отправить сообщение для maratovich с помощью Skype™


gstarcad для программирования не подходит, проверено, лучше поставьте нанокад 5.1 бесплатный.
maratovich вне форума  
 
Автор темы   Непрочитано 21.07.2014, 16:48
#7
inwar


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


Спасибо большое, Уважаемые, за отзывы )
Задачу я решил, в результате получилось такое вот хозяйство:
Код:
[Выделить все]
Option Explicit

Sub SaveLayers()
Dim satteliteFileName As String
Dim index As Integer
Dim lay As GcadLayer

Close
satteliteFileName = GetSatelliteFN

Open satteliteFileName For Output As #1
'For index = thisDrawing.Layers.count - 1 To 0 Step -1
For index = 0 To thisDrawing.Layers.count - 1
  Set lay = thisDrawing.Layers(index)
  Print #1, lay.Name & "=" & lay.LayerOn
Next

Close #1

MsgBox "Finished"

End Sub

Sub ReadLayers()
Dim satteliteFileName As String
Dim index As Integer
Dim lay As GcadLayer
Dim fileRecord As String
Dim delimiterPos As Integer
Dim layerName As String
Dim layerVisibilityAsText As String
Dim layerVisibility As Boolean

Close
satteliteFileName = GetSatelliteFN


Open satteliteFileName For Input As #2
While Not EOF(2)
  Line Input #2, fileRecord
  delimiterPos = InStr(fileRecord, "=")
  
  If (delimiterPos > 0) Then
    layerName = Left(fileRecord, delimiterPos - 1)
    layerVisibilityAsText = Mid(fileRecord, delimiterPos + 1)
    layerVisibility = ConvertToBool(layerVisibilityAsText)
    'MsgBox layerVisibility
    Set lay = GetLayerByName(layerName)
    
    If Not (lay Is Nothing) Then
      thisDrawing.Layers(layerName).LayerOn = layerVisibility
    End If
  End If
Wend
Close #2

MsgBox "Finished"

End Sub

Function ConvertToBool(valueAsText As String) As Boolean
If LCase(valueAsText) = "false" Then ConvertToBool = False
  
If LCase(valueAsText) = "true" Then ConvertToBool = True

'ConvertToBool = True
End Function

Function GetLayerByName(layerName As String) As GcadLayer
Dim index As Integer

Set GetLayerByName = Nothing

For index = 0 To thisDrawing.Layers.count - 1
  If thisDrawing.Layers(index).Name = layerName Then
    Set GetLayerByName = thisDrawing.Layers(index)
    Exit For
  End If
Next
End Function

Function GetSatelliteFN()

Dim satteliteFileName As String
satteliteFileName = thisDrawing.FullName
GetSatelliteFN = satteliteFileName & ".stl"

End Function
Выкладываю с целью, чтобы бедные юзеры GstarCADа не думали, что они в тупике, когда пытаются внедрять коллективную работу на основе внешних ссылок.
inwar вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Работа со слоями - преодоление бага GstarCAD

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Акты скрытых работ Витос Прочее. Архитектура и строительство 324 05.03.2015 12:24
Работа со слоями BABER AutoCAD 3 22.07.2010 23:17
Работа со слоями в AvtoCad vbaklanl AutoCAD 4 13.05.2009 12:06
Viewports-Layer-freeze/thaw in current VP работа со слоями Grinch AutoCAD 2 06.12.2006 16:46