Векторные трехмерные построения - это не ГИСовская сфера, поэтому удивляться тут нечему. Инструмент этот не единственный для трехмерки, и ГИС-разработки вряд ли двинутся в этом направлении... Но простой интерсект решит именно эту проблему ;) Не помню как его делать в AM 9x, чтобы атрибуты сохранялись, а для AV3x вот проверенный скриптик - не раз вместе с ним приходилось тальвеги трехмерить.
Статьи на тему "Как трехмерить векторы средствами ГИС" на geoFAQ нету, все недосуг. Однако сам принцип отработан и описан, могу поделиться черновым текстом.
Скрипт вот: по любой линии делает точки с атрибутами любых пересекаемых линий. Собрать точки в уже трехмерный профиль - понятное дело, EditTools. Тоолько для настоящего профиля этого мало, сами понимаете.
'---------------------------------------------------
' Name: view.polyint2pnt 
'
' Title:  Locate intersections points of polylines or polygon boundaries. 
'
' Topics:  Analysis
'
' Description:  Calculates the location of intersections points of two
'                themes: polylines and/or polygon. Feature attributes for
'                both input feature themes are included in the new point
'                theme attrubute table.
'
' Requires:  A ViewGUI Buttonbar button or Menu item
'
' Self:  NIL
'
' Returns: NIL 
'------ snag the themes -------
theTitle = "Polyline Intersections to Points"
theThemes = av.getActiveDoc.GetThemes
if (theThemes.Count < 2 ) then
  Return NIL
end
theLineThemes = {}
for each thm in theThemes
  if ((thm.GetFTab.FindField("shape").GetType = #FIELD_SHAPELINE) OR (thm.GetFTab.FindField("shape").GetType = #FIELD_SHAPEPOLY)) then
    theLineThemes.Add(thm)
  end
end
if (theLineThemes.Count < 2 ) then
  Return NIL
end
the2Themes = MsgBox.MultiList(theLineThemes,"Select two polyline themes:",theTitle)
if (the2Themes = NIL) then Return NIL end
if (the2Themes.Count <> 2 )  then
  Return NIL
end
fTab0 = the2Themes.Get(0).GetFTab
shpFld0 = fTab0.FindField("shape")
    fList0 = {}
    for each f in fTab0.GetFields
      if (f.IsTypeShape.not) then
        fList0.Add(f.Clone)
      end
    end
    if (fTab0.GetSelection.Count > 0) then
      colToProc0 = fTab0.GetSelection
      nRecs0 = colToProc0.Count
    else
      colToProc0 = fTab0
      nRecs0 = colToProc0.GetNumRecords
    end
fTab1 = the2Themes.Get(1).GetFTab
shpFld1 = fTab1.FindField("shape")
    fList1 = {}
    for each f in fTab1.GetFields
      if (f.IsTypeShape.not) then
        fList1.Add(f.Clone)
      end
    end
    if (fTab1.GetSelection.Count > 0) then
      colToProc1 = fTab1.GetSelection
      nRecs1 = colToProc1.Count
    else
      colToProc1 = fTab1
      nRecs1 = colToProc1.GetNumRecords
    end
'------- create a new point theme with fields -------
fnDefault = FileName.Make("$HOME").MakeTmp("shape","shp")
fnOutput  = FileDialog.Put( fnDefault,"*.shp","Output Shape File" )
if (fnOutput = nil) then exit end
fnOutput.SetExtension("shp")
outFTab = FTab.MakeNew( fnOutput, POINT )
idField = Field.Make("ID",#FIELD_DECIMAL,11,0)
outFTab.AddFields({idField})
outFTab.AddFields(fList0)
outFTab.AddFields(fList1)
'------- intersect the shapes -------
nCount = 0
theID = 1
av.ShowMsg("Intersecting Shapes")
for each rec0 in colToProc0
shp0 = fTab0.ReturnValue(shpFld0,rec0)
  for each rec1 in colToProc1
    shp1 = fTab1.ReturnValue(shpFld1,rec1)
    theMultiPoint = MultiPoint.MakeEmpty
    theMultiPoint = shp0.PointIntersection (shp1)
    outShpFld = outFTab.FindField("Shape")
    if (theMultiPoint <> NIL) then
      thePoints = theMultiPoint.AsList
      for each pnt in thePoints
        newRec = outFTab.AddRecord
        outFTab.SetValue(outShpFld, newRec, pnt)
        outFTab.SetValue(outFTab.FindField("ID"), newRec, theID)
        theID = theID + 1
        for each f in 1 .. (fTab0.GetFields.Count-1)
          theValue = fTab0.ReturnValue(fTab0.GetFields.Get(f),rec0)
          outFTab.SetValue(outFTab.GetFields.Get(f+1),newRec,theValue)
        end
        for each f in 1 .. (fTab1.GetFields.Count-1)
          theValue = fTab1.ReturnValue(fTab1.GetFields.Get(f),rec1)
          outFTab.SetValue(outFTab.GetFields.Get(f+fTab0.GetFields.Count),newRec,theValue)
        end
      end
    end
  end
  nCount = nCount + 1
  av.SetStatus((nCount / nRecs0) * 100)
end
av.ClearStatus
av.ClearMsg
    
if (MsgBox.YesNo("Add shapefile as theme to a view?",
  theTitle, TRUE).Not) then
  exit
end
'- add the new point theme to a view
lstViews = {}
for each d in av.GetProject.GetDocs
  if (d.Is(View)) then
    lstViews.Add( d )
  end
end
lstViews.Add("<New View>")
vweAddTo = MsgBox.ListAsString( lstViews,"Add Theme to:", theTitle )
if (vweAddTo <> nil) then
  if (vweAddTo = "<New View>") then
    vweAddTo = View.Make
    vweAddTo.GetWin.Open
  end
  thmNew = FTheme.Make(outFTab)
  vweAddTo.AddTheme( thmNew )
  vweAddTo.GetWin.Activate
end
'-------------------------------------------------