乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 40|回复: 15

[编程交流] 跟踪线。网

[复制链接]

15

主题

46

帖子

31

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 12:46:23 | 显示全部楼层 |阅读模式
你好
我写了一些代码,但它只在某些时候起作用,我不明白为什么代码假设使用光线和一小行来跟踪一行(如果有必要,我可以用我的概念画一些文件)。当我画两行类似“/”的东西时,问题很奇怪,我启动了光线“->/”它有时起作用,如果有人能带着批评的眼光看代码,有时会画一些愚蠢的东西
  1.    <CommandMethod("src")> _
  2.       Public Sub src()
  3.        Dim lCmd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  4.        Dim acBaza As Database = lCmd.Document.Database
  5.        Using trn As Transaction = acBaza.TransactionManager.StartTransaction
  6.            Dim usrPtOp As PromptPointOptions = New PromptPointOptions("Wskarz srodek pomieszczenia" + vbCrLf)
  7.            Dim usrPt As PromptPointResult = lCmd.GetPoint(usrPtOp)
  8.            Dim prevPt As Point3d = usrPt.Value
  9.            Dim nextPt As Point3d = usrPt.Value
  10.            If usrPt.Status = PromptStatus.OK Then ' sprawdzenie czy poprawnie wpisano punkt poczatkowy
  11.                Dim usrPtXmod As Point3d = New Point3d(usrPt.Value.X + 1, usrPt.Value.Y, usrPt.Value.Z)
  12.                Dim ls3d As LineSegment3d = New LineSegment3d(usrPt.Value, usrPtXmod)
  13.                'FILTRACJA LINII
  14.                Dim typeValue() As TypedValue = {New TypedValue(0, "line")}
  15.                Dim selFilter As SelectionFilter = New SelectionFilter(typeValue)
  16.                Dim selResult As PromptSelectionResult = lCmd.SelectAll(selFilter)
  17.                Dim ssLinie As SelectionSet = selResult.Value
  18.                Dim tabId() As ObjectId
  19.                If selResult.Status = PromptStatus.OK Then ' sprawdzenie czy w rysunku znajduja sie jakies linie
  20.                    If ssLinie.Count >= 1 Then
  21.                        tabId = ssLinie.GetObjectIds
  22.                        Dim oid As ObjectId
  23.                        Dim tmpPt2 As Point3d
  24.                        Dim przeciecia As Integer
  25.                        Dim lnL1 As Line = New Line()
  26.                        Dim promienSledzacy As Ray = New Ray()
  27.                        Dim btr As BlockTableRecord = trn.GetObject(acBaza.CurrentSpaceId, OpenMode.ForWrite)
  28.                        'dodanie do rysunku lnL1 i promienia sledzacego bez parametrow jeszcze niewidoczne
  29.                        btr.AppendEntity(lnL1)
  30.                        trn.AddNewlyCreatedDBObject(lnL1, True)
  31.                        btr.AppendEntity(promienSledzacy)
  32.                        trn.AddNewlyCreatedDBObject(promienSledzacy, True)
  33.                        ' rysowanie pierwszego promienia sledzacego
  34.                        oid = przecieciaPromienia(promienSledzacy, ls3d, tabId, prevPt, nextPt)
  35.                        Dim lnNajblizsza As Line = CType(trn.GetObject(oid, OpenMode.ForRead), Line)
  36.                        'Sprawdzenie ktory punkt jest nizej
  37.                        Dim START As Point3d
  38.                        Dim FIN As Point3d
  39.                        Dim PunktyPomieszczenia As Point3dCollection = New Point3dCollection()
  40.                        If lnNajblizsza.StartPoint.Y > lnNajblizsza.EndPoint.Y Then
  41.                            START = lnNajblizsza.EndPoint
  42.                            PunktyPomieszczenia.Add(lnNajblizsza.EndPoint)
  43.                            PunktyPomieszczenia.Add(lnNajblizsza.StartPoint)
  44.                        Else
  45.                            START = lnNajblizsza.StartPoint
  46.                            PunktyPomieszczenia.Add(lnNajblizsza.StartPoint)
  47.                            PunktyPomieszczenia.Add(lnNajblizsza.EndPoint)
  48.                        End If
  49.                        Dim IloscWszystkichLinii As Integer = tabId.Count()
  50.                        Dim licznik As Integer = 0
  51.                        Dim bezpiecznik As Integer = 0
  52.                        While (licznik < IloscWszystkichLinii) And (bezpiecznik < IloscWszystkichLinii * 6)
  53.                            rysujOdPomocniczy(prevPt, nextPt, tmpPt2, lnL1)
  54.                            szukajPrzecieciaPomocniczego(przeciecia, prevPt, nextPt, tmpPt2, tabId, lnL1)
  55.                            If przeciecia = 0 Then
  56.                                prevPt = tmpPt2
  57.                            ElseIf przeciecia = 1 Then
  58.                                licznik = licznik + 1
  59.                                ls3d = New LineSegment3d(nextPt, prevPt)
  60.                                Using trn1 As Transaction = acBaza.TransactionManager.StartTransaction
  61.                                    Try
  62.                                        Dim btr1 As BlockTableRecord = trn1.GetObject(acBaza.CurrentSpaceId, OpenMode.ForWrite)
  63.                                        Dim ll As Line = CType(trn1.GetObject(lnNajblizsza.ObjectId, OpenMode.ForWrite), Line)
  64.                                        ll.Erase()
  65.                                        trn1.Commit()
  66.                                    Catch ex As Exception
  67.                                        lCmd.WriteMessage("Wyjatek w usowanie linii" + vbCrLf)
  68.                                    Finally
  69.                                        trn1.Dispose()
  70.                                    End Try
  71.                                End Using
  72.                                'aktualizacja lini z rysunku
  73.                                selResult = (lCmd.SelectAll(selFilter))
  74.                                ssLinie = selResult.Value
  75.                                tabId = ssLinie.GetObjectIds
  76.                                'rysowanie promieni
  77.                                oid = przecieciaPromienia(promienSledzacy, ls3d, tabId, prevPt, nextPt)
  78.                                przeciecia = 0
  79.                                lnNajblizsza = CType(trn.GetObject(oid, OpenMode.ForRead), Line)
  80.                            Else
  81.                                lCmd.WriteMessage("WIECEJ NIZ JEDNO PRZECIECIE" + vbCrLf)
  82.                            End If
  83.                            bezpiecznik = bezpiecznik + 1
  84.                        End While
  85.                        If bezpiecznik = IloscWszystkichLinii * 4 Then
  86.                            lCmd.WriteMessage("Linia nie zakonczona")
  87.                        End If
  88.                    Else
  89.                        lCmd.WriteMessage("ERROR : Mniej niz 3 linie pomieszczenie nie moze byc domkniete")
  90.                    End If
  91.                Else
  92.                    lCmd.WriteMessage("ERROR : Brak linii w rysunku")
  93.                End If
  94.                trn.Commit()
  95.            End If
  96.        End Using
  97.    End Sub
  98.    ' RYSUJE PROMIEN SLEDZACY
  99.    ' DRAW A TRACING RAY
  100.    ' SZUKA LINII NAJBLIZSZEJ DANEMU PUNKTOWI
  101.    ' SEARCH FOR THE NEAREST LINE FOR THE POINT
  102.    Public Function przecieciaPromienia(ByRef promienSledzacy As Ray, ByRef ls3d As LineSegment3d, ByRef tabID() As ObjectId, ByRef prevPt As Point3d, ByRef nextPt As Point3d) As ObjectId
  103.        Dim lCmd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  104.        Dim acBaza As Database = Application.DocumentManager.MdiActiveDocument.Database
  105.        Dim lnNajblizsza As Line = Nothing
  106.        Using trn As Transaction = acBaza.TransactionManager.StartTransaction
  107.            Try
  108.                Dim btr As BlockTableRecord = CType(trn.GetObject(acBaza.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
  109.                Dim objID As ObjectId
  110.                Dim ra3d As Ray3d = New Ray3d(ls3d.StartPoint, ls3d.EndPoint)
  111.                Dim odl As Single = 0.0
  112.                Dim odlTmp As Single = 0.0
  113.                For Each objID In tabID
  114.                    Dim ln As Line = CType(trn.GetObject(objID, OpenMode.ForRead), Line)
  115.                    Dim ls As LineSegment3d = New LineSegment3d(ln.StartPoint, ln.EndPoint)
  116.                    Dim ptArray() As Point3d = ls.IntersectWith(ra3d)
  117.                    If ptArray Is Nothing Then Continue For
  118.                    Dim ptkPrzeciecia As Point3dCollection = New Point3dCollection(ptArray)
  119.                    'SZUKANIE PIERWSZEJ NAJBLIZSZEJ LINII   
  120.                    '   odl=sqrt ((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2))
  121.                    odlTmp = Math.Sqrt((prevPt.X - ptkPrzeciecia.Item(0).X) * (prevPt.X - ptkPrzeciecia.Item(0).X) + (prevPt.Y - ptkPrzeciecia.Item(0).Y) * (prevPt.Y - ptkPrzeciecia.Item(0).Y))
  122.                    If odl = 0.0 Then
  123.                        odl = odlTmp
  124.                        nextPt = ptkPrzeciecia.Item(0)
  125.                        lCmd.WriteMessage("Prze:" + nextPt.ToString + "il :" + ptkPrzeciecia.Count.ToString)
  126.                        lnNajblizsza = ln
  127.                    ElseIf odl >= odlTmp Then
  128.                        nextPt = ptkPrzeciecia.Item(0)
  129.                        lCmd.WriteMessage("Prze:" + nextPt.ToString + "il :" + ptkPrzeciecia.Count.ToString)
  130.                        lnNajblizsza = ln
  131.                    End If
  132.                Next
  133.                promienSledzacy = CType(trn.GetObject(promienSledzacy.ObjectId, OpenMode.ForWrite), Ray)
  134.                promienSledzacy.BasePoint = ls3d.StartPoint
  135.                promienSledzacy.SecondPoint = ls3d.EndPoint
  136.                trn.Commit()
  137.            Catch ex As Exception
  138.                lCmd.WriteMessage("Wyjatek w przecieciaPromienia" + ex.ToString + vbCrLf)
  139.            End Try
  140.            Return lnNajblizsza.ObjectId
  141.        End Using
  142.    End Function
  143.    'RYSUJE MALE ODCINKI POMOCNICZE
  144.    'DRAW A LITTLES HELP LINES
  145.    Public Sub rysujOdPomocniczy(ByRef prevPt As Point3d, ByRef nextPt As Point3d, ByRef tmpPt2 As Point3d, ByRef lnL1 As Line)
  146.        Dim lCmd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  147.        Dim acBaza As Database = lCmd.Document.Database
  148.        Dim trn As Transaction = acBaza.TransactionManager.StartTransaction
  149.        Dim btr As BlockTableRecord = trn.GetObject(acBaza.CurrentSpaceId, OpenMode.ForWrite)
  150.        Dim tmpPt1 As Point3d = prevPt
  151.        tmpPt2 = nextPt
  152.        ' WYZNACZANIE KATOW KTORE TRZEBA SPRAWDZIC NA PODSTWAIE POPRZEDNIEGO PUNKTU
  153.        Try
  154.            lnL1 = CType(trn.GetObject(lnL1.ObjectId, OpenMode.ForWrite), Line)
  155.            'Wariant I
  156.            If Math.Round(prevPt.X) = Math.Round(nextPt.X) Then
  157.                If nextPt.Y > prevPt.Y Then
  158.                    tmpPt2 = New Point3d(nextPt.X - 10, nextPt.Y, 0)
  159.                    lnL1.StartPoint = tmpPt1
  160.                    lnL1.EndPoint = tmpPt2
  161.                Else
  162.                    tmpPt2 = New Point3d(nextPt.X + 10, nextPt.Y, 0)
  163.                    lnL1.StartPoint = tmpPt1
  164.                    lnL1.EndPoint = tmpPt2
  165.                End If
  166.                'Wariant II
  167.            ElseIf Math.Round(prevPt.Y) = Math.Round(nextPt.Y) Then
  168.                If nextPt.X > prevPt.X Then
  169.                    tmpPt2 = New Point3d(nextPt.X, nextPt.Y + 10, 0)
  170.                    lnL1.StartPoint = tmpPt1
  171.                    lnL1.EndPoint = tmpPt2
  172.                Else
  173.                    tmpPt2 = New Point3d(nextPt.X, nextPt.Y - 10, 0)
  174.                    lnL1.StartPoint = tmpPt1
  175.                    lnL1.EndPoint = tmpPt2
  176.                End If
  177.                'Wariant III
  178.            ElseIf Math.Round(prevPt.X) < Math.Round(nextPt.X) Then
  179.                If nextPt.Y > prevPt.Y Then
  180.                    tmpPt2 = New Point3d(nextPt.X - 10, nextPt.Y, 0)
  181.                    lnL1.StartPoint = tmpPt1
  182.                    lnL1.EndPoint = tmpPt2
  183.                Else
  184.                    tmpPt2 = New Point3d(nextPt.X, nextPt.Y + 10, 0) ' poprawiono
  185.                    lnL1.StartPoint = tmpPt1
  186.                    lnL1.EndPoint = tmpPt2
  187.                End If
  188.                'Wariant IV
  189.            ElseIf Math.Round(prevPt.X) > Math.Round(nextPt.X) Then
  190.                If nextPt.Y < prevPt.Y Then
  191.                    tmpPt2 = New Point3d(nextPt.X + 10, nextPt.Y, 0)
  192.                    lnL1.StartPoint = tmpPt1
  193.                    lnL1.EndPoint = tmpPt2
  194.                Else
  195.                    tmpPt2 = New Point3d(nextPt.X, nextPt.Y - 10, 0)
  196.                    lnL1.StartPoint = tmpPt1
  197.                    lnL1.EndPoint = tmpPt2
  198.                End If
  199.            End If
  200.            ' lCmd.WriteMessage(lnL1.StartPoint.ToString + "-" + lnL1.EndPoint.ToString + vbCrLf)
  201.            trn.Commit()
  202.        Catch ex As Exception
  203.            lCmd.WriteMessage("Wyjatek w rysujOdPomocniczy" + vbCrLf)
  204.        Finally
  205.            trn.Dispose()
  206.        End Try
  207.    End Sub
  208.    ' SEARCHES THE INTERS OF THE LITTLE HELP LINE
  209.    Public Sub szukajPrzecieciaPomocniczego(ByRef przeciecia As Integer, ByRef prevPt As Point3d, ByRef nextPt As Point3d, ByRef tmpPt2 As Point3d, ByRef tabID() As ObjectId, ByRef lnL1 As Line)
  210.        Dim lCmd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  211.        Dim acBaza As Database = lCmd.Document.Database
  212.        Dim trn As Transaction = acBaza.TransactionManager.StartTransaction
  213.        Dim Cl_crsPt As Point3dCollection = New Point3dCollection()
  214.        Dim intPomoc1 As Integer
  215.        Dim intPomoc2 As Integer
  216.        Try
  217.            Dim btr As BlockTableRecord = trn.GetObject(acBaza.CurrentSpaceId, OpenMode.ForWrite)
  218.            Dim obj As ObjectId
  219.            For Each obj In tabID
  220.                Dim ln As Line = CType(trn.GetObject(obj, OpenMode.ForRead), Line)
  221.                ln.IntersectWith(lnL1, Intersect.OnBothOperands, lnL1.GetPlane(), Cl_crsPt, intPomoc1, intPomoc2)
  222.            Next
  223.            przeciecia = Cl_crsPt.Count
  224.            If Cl_crsPt.Count = 1 Then
  225.                prevPt = Cl_crsPt.Item(0)
  226.            ElseIf Cl_crsPt.Count > 1 Then
  227.                lCmd.WriteMessage("Wiecej niz jedno przeciecie:" + Cl_crsPt.Count.ToString)
  228.                Dim tmpPunkt As Point3d
  229.                Dim odlPtkTmp As Single
  230.                Dim odlPtk As Single
  231.                For Each tmpPunkt In Cl_crsPt
  232.                    odlPtkTmp = Math.Sqrt((prevPt.X - Cl_crsPt.Item(0).X) * (prevPt.X - Cl_crsPt.Item(0).X) + (prevPt.Y - Cl_crsPt.Item(0).Y) * (prevPt.Y - Cl_crsPt.Item(0).Y))
  233.                    If odlPtk = 0.0 Then
  234.                        odlPtk = odlPtkTmp
  235.                        nextPt = Cl_crsPt.Item(0)
  236.                    ElseIf odlPtk >= odlPtkTmp Then
  237.                        nextPt = Cl_crsPt.Item(0)
  238.                    End If
  239.                    przeciecia = 1
  240.                Next
  241.            End If
  242.            trn.Commit()
  243.        Catch ex As Exception
  244.            lCmd.WriteMessage("Wyjatek w szukajPrzecieciaPomocniczego" + vbCrLf)
  245.        Finally
  246.            trn.Dispose()
  247.        End Try
  248.    End Sub
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 12:51:27 | 显示全部楼层
我认为发布一个显示例程设计要处理的设置的图形,以及例程成功运行后应该显示的相同设置,会很有帮助。这将帮助我们提供有用的调试建议,特别是考虑到我们中的一些人不理解许多变量名或注释。
 
我想例程失败的示例文件(如果它实际上以一致的方式失败)也将有助于调试。
回复

使用道具 举报

15

主题

46

帖子

31

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 12:56:59 | 显示全部楼层
你好
我已经添加了一些英文注释,但如果仍然不清楚,我会在您需要的地方添加
我的概念

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

 
用法

                               
登录/注册后可看大图

                               
登录/注册后可看大图

 

                               
登录/注册后可看大图
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 13:01:03 | 显示全部楼层
我不确定我是否完全理解这个过程,但请给我一些时间(我在正常日常活动的休息期间会看这个)。
 
我遇到的一个早期问题是,Visual Studio将此行标记为错误:
Dim IloscWszystkichLinii作为整数=tabId。计数()
 
这是另一个导入的命名空间的一部分吗?我可以用其中一种吗
 
  1. Dim IloscWszystkichLinii As Integer = tabId.GetUpperBound(0)

 

 
  1. Dim IloscWszystkichLinii As Integer = tabId.GetUpperBound(0) + 1
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 13:06:22 | 显示全部楼层
作为可能帮助我们理解过程的另一点输入,真实世界中的几何建模是什么?
 
一、 就个人而言,无法确定这是土木工程的某个方面,还是机械问题。它是电气/电子的吗?这似乎与建筑无关,但我不能肯定地说。
回复

使用道具 举报

15

主题

46

帖子

31

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 13:07:01 | 显示全部楼层
你好
嗯,这句话对我来说很好a不要出错
它假设得到图形中有多少条线
Dim IloscWszystkichLinii作为整数=tabId。计数()
 
我的想法是,当我有一个2d房子的蓝图,有很多房间的时候,我用我的宏,点击一个房间里面,如果它能返回我这个房间的所有墙壁,那就太好了。我不知道我是否正确地解释了它
回复

使用道具 举报

15

主题

46

帖子

31

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 13:12:28 | 显示全部楼层
我认为问题在于跟踪光线有时它根本无法与下一行交互,但为什么有时可以,有时不行我不知道
重要的一点是,这个宏将以相反的时钟方向搜索墙壁
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 13:14:32 | 显示全部楼层
啊,这是一个基于架构的例程。这很酷–它将帮助我理解参数。不幸的是,我将有很多工作要做,所以我要到今晚才能深入研究。
 
关于。计数问题,Visual Studio向我显示附件。你在使用什么进口产品?
134721g3m21b29cl2rva2o.jpg
回复

使用道具 举报

15

主题

46

帖子

31

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 13:20:56 | 显示全部楼层
我来自地球的另一个角落,所以今晚很好
 
导入Autodesk。AutoCAD。运行时
导入Autodesk。AutoCAD。几何学
导入Autodesk。AutoCAD。应用程序服务
导入Autodesk。AutoCAD。编辑输入
导入Autodesk。AutoCAD。数据库服务
导入系统。窗户
导入系统。收藏。通用的
 
我正在使用vs2008
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 13:23:07 | 显示全部楼层
这很奇怪。我已经包括了与上面发布的相同的导入列表,并且这行仍然报告了一个错误(我也在使用Visual Studio 2008-Standard edition)。尽管这种情况可能很有趣,但我现在将忽略它,并使用最好的替代方案来运行该程序。
 
我假设我在上面发布的建议:
 
  1. Dim IloscWszystkichLinii As Integer = tabId.GetUpperBound(0) + 1

 
应该有效。或者,也许:
 
  1. Dim IloscWszystkichLinii As Integer = ssLinie.Count

 
我认为他们两个都会得到与你得到的相同的整数
 
  1. Dim IloscWszystkichLinii As Integer = tabId.Count()

 
如果你有机会,试试看我的假设是否正确。谢谢
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-5 04:34 , Processed in 0.534288 second(s), 74 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表