Для чего это нужно. Пользователи нарисовали картинку из перехлестывающихся полигонов. Картинку менять нельзя, но нужно сделать так, чтобы полигоны не перехлестывались.
Я было подумал, что в этом мне поможет 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