Civil 3D API fail

7 milhões de comentários
Ora pois!!! Não sei por que, mas me apareceu um desenho com plano de sondagens onde o camarada insistia em querer o KM, ou estaca, do furo.

Bem, pensei, simples, enfia um Reference text no label do ponto fazendo referencia ao alinhamento e formata a mesma....

É... queria que fosse simples assim... Olhando o label style dos pontos, não há opção de reference text:


Bom, então vamos pro User-Defined Property Classifications e criamos uma propriedade para armazenar o valor do KM então:


Sim, fica até bacana no properties:

Tudo bem que é uma propriedade estática, que não irá se atualizar sozinha...

Em fim, pensei: escrevo meia duzia de linhas em LISP mesmo e coloco esse valor nos pontos, afinal são centenas de pontos e eu não quero ter de digitar um por um....

É aí que a vaca vai pro brejo. A API do Civil 3D tem a função necessária para isso, mas ela simplesmente não funciona!!!!

O método em questão é "SetUserDefinedPropertyValue", que aparece no help do Civil 3D, aqui

Pensei, vai ver eu tô comendo bola e tentando usar o método de maneira errada...
Procurei e achei um post no forum da autodesk... leiam

A título de curiosidade, o programa em DOTNET seria assim:

Imports Autodesk.Civil.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.Civil.Land.DatabaseServices
Imports Autodesk.AECC.Interop.Land
Imports Autodesk.Civil.Land.Settings


Public Class Class1
    Function ED() As Editor
        Return Application.DocumentManager.MdiActiveDocument.Editor
    End Function

    Function TR() As Transaction
        Return Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction
    End Function

    <commandmethod ("taoffpt") >
    Public Sub StaOffPt()
        Dim ss As PromptSelectionResult = ED.GetSelection(
             New SelectionFilter({New TypedValue(0, "AECC_COGO_POINT")}))
        If ss.Status <> PromptStatus.OK Then Exit Sub

        Dim peo As New PromptEntityOptions(vbLf & "Selecione o alinhamento")
        peo.SetRejectMessage(vbLf & "Somente alinhamento")
        peo.AddAllowedClass(GetType(Alignment), True)

        Dim per As PromptEntityResult = ED.GetEntity(peo)
        If per.Status <> PromptStatus.OK Then Exit Sub

        With TR()
            Dim alin As Alignment = per.ObjectId.GetObject(OpenMode.ForRead)
           

            Try
                For Each ptid As ObjectId In ss.Value.GetObjectIds
                    Dim pt As PointEntity = ptid.GetObject(OpenMode.ForWrite)
                    Dim sta, offset As Double
                    Try
                        alin.StationOffset(pt.Location.X, pt.Location.Y, sta, offset)
                        Dim acadpt As IAeccPoint = pt.AcadObject

                        acadpt.SetUserDefinedPropertyValue("KM", sta)
                        acadpt.SetUserDefinedPropertyValue("OFFSET", 
Math.Abs(offset))
                        acadpt.SetUserDefinedPropertyValue("LADO",
 If(offset > 0, "L.D.", If(offset < 0, "L.E.", "EIXO")))
                    Catch
                        ED.WriteMessage(vbLf & Err.Description)
                    End Try
                Next
            Catch

            End Try
            .Commit()
        End With
    End Sub
End Class
</commandmethod>

Em fim.... Resultado, fiquei 3 horas digitando o KM em cada ponto.... Antes que você me pergunte, eu usei os pontos do civil só para poder criar as tabelas de pontos com suas coordenadas e o bendito KM.... Algo como:
Depois de pronto, cheguei a conclusão que teria sido mais produtivo usar blocos com atributos e programar a obtenção do KM e a geração da tabela. Que tal o desafio? Alguém se habilita?

Primeiro post do ano

3 milhões de comentários
É gente primeiro post do ano!!! mas só pro civil 3d me trollar, heheheh:

Liguei o bicho, abri um arquivo qualquer e me vem essa mensagem... logo no primeiro dia!!!

LinkWithin

Related Posts Plugin for WordPress, Blogger...