| Обсуждение |
| Поиск в справочнике [ Дмитрий Глубоков ]Понедельник, 28 февраля 2011, 10:47
Здравствуйте.
У меня такой вопрос: Есть справочник вида -
________________________________________
| КОД | СОКР. ИМЯ | ПОЛНОЕ ИМЯ |
________________________________________
| 1 | стб. дер. | столб деревянный |
________________________________________
| 2 | стб. ж/б. |столб железобетонный|
________________________________________, и т.д.
Поле Код имеет атрибуты - ключевое, уникальное, непустое.
Есть следующий код:
Dim code As Intrger
objGDBLayer = objGDBMap.Layers.Item(LAYER_RAIL) ' текущий слой
objGDBFeatureType = objGDBLayer.FeatureTypes.Item(FEATURETYPE_LIGHT) 'текущий тип геометрий
objGDBTable = objGDB.Tables.Item(TABLE_NAME_REF) ' текущий справочник
objGDBFeatureSet = objGDBFeatureType.OpenFeatureset
objGDBFeatureSet.MoveFirst()
If objGDBFeatureSet.FeatureCount > 0 Then
Do ' ищем объекты типа FEATURETYPE_LIGHT
' имя стиля объекта (в справочнике - ПОЛНОЕ ИМЯ)
obj_name=objGDBFeatureSet.Feature.MapSymbol.Name
......
Здесь требуется код для нахождения в сравочнике "TABLE_NAME_REF" в поле "ПОЛНОЕ НАЗВАНИЕ" = bj_name и присвоение переменной code значения из поля "КОД"
......
objGDBFeatureSet.MoveNext()
Loop Until objGDBFeatureSet.EOF
End If
Пожалуйста помогите. |
|
| [ Дмитрий Глубоков ]Понедельник, 28 февраля 2011, 11:51
Пробовал такой код:
objGDBFieldSeek = objGDBRecordset.Fields.Item(FIELD_NAME_KEY)
objGDBRecordset.Seek(objGDBFieldSeek, objGDBFeatureSet.Feature.MapSymbol.Name)
Но так как поле "ПОЛНОЕ ИМЯ" не уникальное и не ключевое, то возникает ошибка(((. |
|
| [ Objectland Support ]Вторник, 1 марта 2011, 13:11
Так как поле ПОЛНОЕ ИМЯ в Вашем справочнике не имеет атрибутов уникальности (ведь это так?), то, в общем случае, при поиске по этому полю Вы можете получить несколько записей.
Или наложите ограничение уникальности на поле ПОЛНОЕ ИМЯ, чтобы находилось не более одной записи, или измените критерий построения выборки (например, постройте выборку, содержащую записи со значением поля ПОЛНОЕ ИМЯ, совпадающим с искомым) и позиционируйтесь на первую запись в выборке или пересмотрите исходные условия и измените задачу (например, рассмотрите возможность использовать в качестве уникального кода внутренний номер условного обозначения). |
|
| [ Petr27 ]Вторник, 1 марта 2011, 13:40
Вообще можно настроить фильтр в теме и условные обозначения будут показаны нужным стилем. Это лучше, чем устанавливать объектам собственные стили. |
|
| [ Дмитрий Глубоков ]Вторник, 1 марта 2011, 16:55
Спасибо.
Я сделал пока так (перебором по всем строкам справочника),
Do
If objGDBRecordset.Fields.Item("ПОЛНОЕ ИМЯ").Value = objGDBFeatureSet.Feature.MapSymbol.Name Then
code = objGDBRecordset.Fields.Item("КОД").Value
Exit Do
End If
objGDBRecordset.MoveNext()
Loop Until objGDBRecordset.EOF
Конечно криво, но пока так. |
|
| [ Objectland Support ]Вторник, 1 марта 2011, 17:21
Опишите в общем виде Вашу задачу, может мы сможем подсказать Вам оптимальное решение. |
|
| [ Дмитрий Глубоков ]Среда, 2 марта 2011, 08:05
В общем виде, одна из задач такая:
Н-р есть геометрия - "светофор". Светофоры имеют условные знаки - светофор карликовый двухлинзовый, светофор карликовый трехлинзовый, светофор карликовый четырехлинзовый и т.д. Есть справочник, где все это прописано, и каждому виду светофора присвоен уникальный код в справочнике.
К геометрии присоеденена таблица, где этот код надо прописывать вручную.
Задача состоит в том, что-бы автоматически, в зависимости условного знака светофора, добавить код светофора в таблицу.
Соответственно, таких геометрий на карте много.
Я делал так:
- перебирал все геометрии типа "светофор", читал имя стиля(условный знак) текущей геометрии кодом objGDBFeatureSet.Feature.MapSymbol.Name, искал это имя в справочнике, считывал код и записывал его в присоеденённую к геометрии ведомость.
P.S. ещё одна важная проблема; при решении задачи, если условный знак стоит по умолчанию (т.е. не выбран вручную из библиотеки, а используется наследуемый), то при попытке выяснить его имя кодом objGDBFeatureSet.Feature.MapSymbol.Name, выдается ошибка NullReferenceException. Хотя по умолчанию, имя у этого условного знака все-же есть. |
|
| [ Дмитрий Глубоков ]Среда, 2 марта 2011, 08:30
И еще вопрос: как программно поменять условный знак геометрии?
objGDBFeatureSet.Feature.MapSymbol.Name = "светофор карликовый трехлинзовый"? |
|
| [ Objectland Support ]Среда, 2 марта 2011, 13:18
Можно использовать в качестве кодов светофоров сразу внутренний номер условного обозначения (MapSymbol.Number), эти же внутренние номера можно использовать в справочнике.
При получении имени/внутреннего номера условного обозначения нужно предварительно проверять, установлено ли условное обозначение для геометрии или используется наследуемое/по умолчанию (Feature.MapSymbol возвращает Null, если условное обозначение не установлено).
Программно установить/поменять условное обозначение геометрии можно с помощью свойства aFeature.MapSymbol, установив это свойство в нужное значение (aFeature.MapSymbol = aMapSymbol), условные обозначения получаются из библиотеки стилей отображения геометрий (локальной aGDB.Library или общей aGBDEngine.SharedLibrary). |
|
| [ Дмитрий Глубоков ]Среда, 2 марта 2011, 14:40
Огромное спасибо. Задачка потихонечку решается. |
|
| [ ObjectLand Support ]Среда, 2 марта 2011, 15:41
1. Свойство objGDBFeatureSet.Feature.MapSymbol может возвращать Null если набор геометрий objGDBFeatureSet построен не на основе темы (посмотрите описание свойства MapSymbol по ссылке http://www.objectland.ru/support/doc/comapi/Geometry_MapSymbol.html).
2. Чтобы программно поменять условный знак геометрии надо сначала получить условный знак, а затем присвоить его геометрии:
objMapSymbol = objGDBEngine.SharedLibrary.MapSymbols.Item("светофор карликовый трехлинзовый")
objGDBFeatureSet.Feature.MapSymbol = objMapSymbol |
|
| [ Дмитрий Глубоков ]Четверг, 3 марта 2011, 13:38
Спасибо за помощь.
Я именно так и сделал.
Dim instance As NullReferenceException
If objGDBFeatureSet.Feature.MapSymbol Is instance Then
objGDBFeatureSet.Feature.MapSymbol = objGDBLibrary.MapSymbols.Item("светофор карликовый трехлинзовый")
End If |
|
ОтветитьЗнаком «*» отмечены обязательные для заполнения поля. |
| |