Для чего это нужно. Пользователи нарисовали картинку из перехлестывающихся полигонов. Картинку менять нельзя, но нужно сделать так, чтобы полигоны не перехлестывались.
Я было подумал, что в этом мне поможет rowid и даже кто-то где-то(http://www.mail-archive.com/mapinfo-l@c ... 04787.html) утверждал, что это так, но в некоторых случаях определение порядка прорисовки по rowid не срабатывает.
Вот мой код для такой операции по rowid.
Код: Выделить всё
Include "MapBasic.DEF"
Declare Sub Main
Declare Function NumerateAreaRecordsToField(byVal TableName as String,byVal FieldName as String) as Integer
Declare Sub CleanAsVisible(ByVal LayerName as String, ByVal IdField as string)
Declare Function GetDataForCommands(ByVal LayerName as String) as String
Sub Main
'Id - это имя поля целого типа, которое должно быть в таблице
call CleanAsVisible("Layer_name","Id")
End Sub
Sub CleanAsVisible(ByVal LayerName as String, ByVal IdField as string)
Dim n,i as Integer
Dim StrCommand,StrCommand2 as String
n=NumerateAreaRecordsToField(LayerName,IdField)
StrCommand="select * from "+LayerName+" Where "
'Note StrCommand+IdField+">0"
Run command StrCommand+IdField+">0"
'Note StrCommand+IdField+">0"
Set Map Layer LayerName Editable On
Set Target On
Run command StrCommand+IdField+">0"
Objects Overlay Into Target
for i=1 to n-1
Run command StrCommand+IdField+"="+Str$(i)
Set Target On
Run command StrCommand+IdField+"="+Str$(i)
Run command StrCommand+"(Obj Contains Part (Select obj from Selection))and("+IdField+">"+Str$(i)+")"
if(SelectionInfo(SEL_INFO_NROWS)>0) then
StrCommand2="Objects Erase Into Target "+GetDataForCommands(LayerName)
Run Command StrCommand2
end if
next
End Sub
Function GetDataForCommands(ByVal LayerName as String)as String
Dim j,numCols as SmallInt
Dim rez,cName as String
rez= "Data "
numCols=TableInfo(LayerName ,TAB_INFO_NCOLS)
for j=1 to numCols
cName=ColumnInfo(LayerName,"Col"+Str$(j),COL_INFO_NAME)
rez=rez+cName+"="+cName
if(j<>numCols) then
rez=rez+","
end if
next
GetDataForCommands=rez
End Function
Function NumerateAreaRecordsToField(byVal TableName as string,byVal FieldName as string)as Integer
Dim i as Integer
Dim StrCommand as String
i=0
Select * from TableName
StrCommand="update "+TableName+" set "+FieldName+"=0"
Run Command StrCommand
StrCommand="Select * from "+TableName+" where ((Str$(ObjectInfo(obj,"+Str$(OBJ_INFO_TYPE)+"))="""+Str$(OBJ_TYPE_ELLIPSE)+""")or(Str$(ObjectInfo(obj,"+Str$(OBJ_INFO_TYPE)+"))="""+Str$(OBJ_TYPE_REGION)+""")or(Str$(ObjectInfo(obj,"+Str$(OBJ_INFO_TYPE)+"))="""+Str$(OBJ_TYPE_RECT)+""")or(Str$(ObjectInfo(obj,"+Str$(OBJ_INFO_TYPE)+"))="""+Str$(OBJ_TYPE_ROUNDRECT)+"""))"
'note StrCommand
Run Command StrCommand
fetch first from selection
do while not EOT(selection)
i=i+1
StrCommand="update selection"+""+" set "+FieldName+"="+Str$(i)+" where rowid="+selection.rowid
'note StrCommand
Run Command StrCommand
fetch next from selection
loop
NumerateAreaRecordsToField=i
End Function