乐筑天下

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

收拾东西

[复制链接]

21

主题

58

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
142
发表于 2017-7-13 06:13:11 | 显示全部楼层 |阅读模式
  1.                         Dim curves As DBObjectCollection = GetNewCurves(myDocuments, slabRegion, updatedSpanLine, localSpanVector, entForExtension, jaggedLine, slabAreaPLine, bStretch, PointToTrim, bIsSlabUpdated)
  2.                         slabAreaPLine.Delete()
  3.                         If bIsSlabUpdated = False Then
  4.                             Exit Sub
  5.                         End If
  6.                         'Create a new Region
  7.                         CreateNewRegion(curves, slab, myDocuments, regCentroid)

上面的代码被埋藏在一个循环的块引用中,所以对于每个新的块引用,它正在DIM一个新的“曲线”变量(不是我选择的编码设计)。 我是否需要在重新DIMed之前清除此变量,或者是否可以离开垃圾回收来拾取并删除它?

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

57

主题

559

帖子

13

银币

中流砥柱

Rank: 25

铜币
786
发表于 2017-7-13 06:27:18 | 显示全部楼层
VB做了一些我并不假装理解的事情,
但是,原则上:
在循环外声明变量
并在循环中赋值是公认的常规做法...尽管这可能取决于你还有什么我们不知道的事情。
我很惊讶编译器允许您重新声明变量。
关于机制;
您是否在GetNewCurves中创建了一个DBObjectCollection并将其传递回变量Curves??
回复

使用道具 举报

21

主题

58

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
142
发表于 2017-7-13 07:16:35 | 显示全部楼层
恐怕我的前辈们更喜欢在这样的函数/过程中声明变量,并编写超过数百行代码的多循环函数(通常处理实体以选择块引用)...见下文一个很好的例子。然而,我从痛苦的经历中学会了如果它没有损坏就不要干涉它!
是的,GetNewCurves函数返回在该函数中创建的对象:
  1.     Private Function GetNewCurves(ByRef myDocuments As AcadDocumentManagerExample,
  2.                                   ByRef slabRegion As AcadRegion, ByRef updatedSpanLine As Line, ByVal localSpanVector As String, ByRef entForExtension As AcadEntity,
  3.                                   ByRef jaggedLine As Line, ByVal slabAreaPLine As AcadLWPolyline, ByVal bStretch As Boolean, ByVal PointToTrim As Point3d, ByRef bIsSlabUpdated As Boolean) As DBObjectCollection
  4.         Dim SpanStartX, SpanStartY, SpanEndX, SpanEndY As Double
  5.         Dim ptPrev As Point3d = Point3d.Origin
  6.         Dim ptVertLinePt As Point3d = Point3d.Origin
  7.         Dim curves As DBObjectCollection = New DBObjectCollection()
  8.         Dim Ent As AcadEntity
  9.         Dim lstUpdatedLines As List(Of String) = New List(Of String)
  10.         Try
  11.             'Get Span coords from Block attributes
  12.             Dim args() As String = localSpanVector.Split(",")
  13.             If args.Length = 4 Then
  14.                 SpanStartX = (Val(args(0)) * FImperialScaleFactor)
  15.                 SpanStartY = (Val(args(1)) * FImperialScaleFactor)
  16.                 SpanEndX = (Val(args(2)) * FImperialScaleFactor)
  17.                 SpanEndY = (Val(args(3)) * FImperialScaleFactor)
  18.             End If
  19.             'Get exploded lines of the region
  20.             If Not slabRegion Is Nothing Then
  21.                 'Get Vertical Lines
  22.                 Dim lstVerticalLines As List(Of Line) = GetVerticalLines(slabRegion, SpanStartX, SpanStartY, SpanEndX, SpanEndY, myDocuments)
  23.                 'Explode the region to extend its lines
  24.                 Dim unOrderexplodedKr As Object = slabRegion.Explode
  25.                 Dim explodedKr As Object = orderexpl(unOrderexplodedKr, myDocuments)
  26.                 For ixs As Integer = 0 To UBound(explodedKr)
  27.                     If Not ((TypeOf (explodedKr(ixs)) Is AcadRegion) Or (TypeOf (explodedKr(ixs)) Is AcadPoint)) Then
  28.                         If TypeOf (explodedKr(ixs)) Is AcadLine Then
  29.                             'Get the points of the line
  30.                             Dim line As AcadLine = explodedKr(ixs)
  31.                             Dim ptStart As Point3d = New Point3d(line.StartPoint(0), line.StartPoint(1), 0)
  32.                             Dim ptEnd As Point3d = New Point3d(line.EndPoint(0), line.EndPoint(1), 0)
  33.                             'Dont extend vertical lines. Just add it in curves array.
  34.                             Dim bIsVertical As Boolean = CheckForVerticalLine(line, lstVerticalLines)
  35.                             If bIsVertical Then
  36.                                 If Not lstUpdatedLines.Contains(line.Handle) Then
  37.                                     curves.Add(New Line(ptStart, ptEnd))
  38.                                 End If
  39.                                 Continue For
  40.                             End If
  41.                             'Check if the line is a Span
  42.                             Dim orgSpanLine As Line2d = New Line2d(New Point2d(SpanStartX, SpanStartY),
  43.                                                                New Point2d(SpanEndX, SpanEndY))
  44.                             Dim bSpan As Boolean = False
  45.                             If orgSpanLine.GetDistanceTo(New Point2d(ptStart.X, ptStart.Y))  0 Then
  46.                                 Dim ptExtendedPt As Point3d = New Point3d(Math.Round(obj(0)), Math.Round(obj(1)), obj(2))
  47.                                 'Check if point is on Slab outline and it is a stretch command then dont allow to stretch
  48.                                 'OR if point outside Slab outline and it is trim command then dont allow to trim
  49.                                 Dim res As PointContainment = getPointContainment(slabAreaPLine, ptExtendedPt)
  50.                                 'There was issue in trim in a rare scenario, where the intersection point is lying on the slab but result is giving it outsie
  51.                                 If res = PointContainment.Outside Then
  52.                                     If bStretch = False Then
  53.                                         Dim tol As Double = 0.4
  54.                                         ptExtendedPt = New Point3d(obj(0), obj(1), 0)
  55.                                         res = getPointContainment(slabAreaPLine, ptExtendedPt)
  56.                                         If res = PointContainment.Outside Then
  57.                                             ptExtendedPt = New Point3d(obj(0), obj(1) + tol, 0)
  58.                                             res = getPointContainment(slabAreaPLine, ptExtendedPt)
  59.                                         End If
  60.                                         If res = PointContainment.Outside Then
  61.                                             ptExtendedPt = New Point3d(obj(0), obj(1) - tol, 0)
  62.                                             res = getPointContainment(slabAreaPLine, ptExtendedPt)
  63.                                         End If
  64.                                         If res = PointContainment.Outside Then
  65.                                             ptExtendedPt = New Point3d(obj(0) + tol, obj(1), 0)
  66.                                             res = getPointContainment(slabAreaPLine, ptExtendedPt)
  67.                                         End If
  68.                                         If res = PointContainment.Outside Then
  69.                                             ptExtendedPt = New Point3d(obj(0) - tol, obj(1), 0)
  70.                                             res = getPointContainment(slabAreaPLine, ptExtendedPt)
  71.                                         End If
  72.                                         If res = PointContainment.Outside Then
  73.                                             ptExtendedPt = New Point3d(obj(0) + tol, obj(1) + tol, 0)
  74.                                             res = getPointContainment(slabAreaPLine, ptExtendedPt)
  75.                                         End If
  76.                                         If res = PointContainment.Outside Then
  77.                                             ptExtendedPt = New Point3d(obj(0) + tol, obj(1) - tol, 0)
  78.                                             res = getPointContainment(slabAreaPLine, ptExtendedPt)
  79.                                         End If
  80.                                         If res = PointContainment.Outside Then
  81.                                             ptExtendedPt = New Point3d(obj(0) - tol, obj(1) + tol, 0)
  82.                                             res = getPointContainment(slabAreaPLine, ptExtendedPt)
  83.                                         End If
  84.                                         If res = PointContainment.Outside Then
  85.                                             ptExtendedPt = New Point3d(obj(0) - tol, obj(1) - tol, 0)
  86.                                             res = getPointContainment(slabAreaPLine, ptExtendedPt)
  87.                                         End If
  88.                                     End If
  89.                                 End If
  90.                                 If res = PointContainment.Inside Then ' res = PointContainment.OnBoundary Or
  91.                                     If bStretch = True Then
  92.                                         GoTo donteditedge
  93.                                     End If
  94.                                 ElseIf res = PointContainment.Outside Then
  95.                                     If bStretch = False Then
  96.                                         GoTo donteditedge
  97.                                     End If
  98.                                 End If
  99.                                 Dim ptTmp As Point3d = New Point3d(0, 0, 0)
  100.                                 If (bStretch And ptStart.DistanceTo(ptExtendedPt) > ptEnd.DistanceTo(ptExtendedPt)) _
  101.                                     Or (bStretch = False And (ptStart.DistanceTo(PointToTrim) > ptEnd.DistanceTo(PointToTrim))) Then
  102.                                     'If end point is extended, the take edge from start to extended point
  103.                                     curves.Add(New Line(ptStart, ptExtendedPt))
  104.                                     'Update the next curve and it is curves array
  105.                                     Dim nextline As AcadLine
  106.                                     If ixs = UBound(explodedKr) Then
  107.                                         nextline = explodedKr(0)
  108.                                     Else
  109.                                         nextline = explodedKr(ixs + 1)
  110.                                     End If
  111.                                     Dim ptNextEndpt As Point3d = New Point3d(nextline.EndPoint(0), nextline.EndPoint(1), 0)
  112.                                     curves.Add(New Line(ptExtendedPt, ptNextEndpt))
  113.                                     lstUpdatedLines.Add(nextline.Handle)
  114.                                     ptTmp = ptNextEndpt
  115.                                     'Update Span vector
  116.                                     If bSpan = True Then
  117.                                         updatedSpanLine = New Line(ptStart, ptExtendedPt)
  118.                                     ElseIf bJagged = True Then
  119.                                         jaggedLine = New Line(ptStart, ptExtendedPt)
  120.                                     End If
  121.                                 Else
  122.                                     'If start point is extended, the take edge from extended to end point
  123.                                     curves.Add(New Line(ptExtendedPt, ptEnd))
  124.                                     'Update the previous curve
  125.                                     Dim prevline As AcadLine
  126.                                     If ixs = 0 Then
  127.                                         prevline = explodedKr(UBound(explodedKr))
  128.                                     Else
  129.                                         prevline = explodedKr(ixs - 1)
  130.                                     End If
  131.                                     Dim ptPrevstartpt As Point3d = New Point3d(prevline.StartPoint(0), prevline.StartPoint(1), 0)
  132.                                     Dim ptPrevendpt As Point3d = New Point3d(prevline.EndPoint(0), prevline.EndPoint(1), 0)
  133.                                     curves.Add(New Line(ptPrevstartpt, ptExtendedPt))
  134.                                     lstUpdatedLines.Add(prevline.Handle)
  135.                                     ptTmp = ptPrevendpt
  136.                                     'Update Span vector
  137.                                     If bSpan = True Then
  138.                                         updatedSpanLine = New Line(ptExtendedPt, ptEnd)
  139.                                     ElseIf bJagged = True Then
  140.                                         jaggedLine = New Line(ptExtendedPt, ptEnd)
  141.                                     End If
  142.                                 End If
  143.                                 If ptPrev = Point3d.Origin Then
  144.                                     ptPrev = ptExtendedPt
  145.                                 Else
  146.                                     If entForExtension.ObjectName = "AcDbPolyline" Then
  147.                                         Dim ptTmpExtended As Point3d = New Point3d(ptExtendedPt.X, ptExtendedPt.Y, 0)
  148.                                         Dim ptTmpPrev As Point3d = New Point3d(ptPrev.X, ptPrev.Y, 0)
  149.                                         Dim pline As AcadLWPolyline = TryCast(entForExtension, AcadLWPolyline)
  150.                                         GetCurvesWithinTwoExtendedPoints(curves, pline, ptTmpExtended, ptTmpPrev)
  151.                                     Else
  152.                                         curves.Add(New Line(ptPrev, ptExtendedPt))
  153.                                     End If
  154.                                     ptPrev = ptExtendedPt
  155.                                 End If
  156.                                 bIsSlabUpdated = True
  157.                             Else
  158. donteditedge:
  159.                                 ' If the line is on the side to trim then do not consider this line
  160.                                 If Not bIsVertical And Not bStretch Then
  161.                                     ' get trim direction. +ve towards right i.e. right portion will be trimmed, -ve towards left
  162.                                     ' the direction is calculated based on nearest point on entForExtension
  163.                                     ' and the start point of slab outline line
  164.                                     Dim dirVec As Integer = 0
  165.                                     Dim tempLine As Line = Nothing
  166.                                     Dim tempPLine As Polyline = Nothing
  167.                                     Dim closestPt As Point3d
  168.                                     If entForExtension.ObjectName = "AcDbPolyline" Then
  169.                                         Dim pLine As AcadLWPolyline = TryCast(entForExtension, AcadLWPolyline)
  170.                                         tempPLine = New Polyline()
  171.                                         Dim coordinates As Object = pLine.Coordinates
  172.                                         Dim verticesCount As Integer = (UBound(coordinates) + 1) / 2
  173.                                         For index As Integer = 0 To verticesCount - 1
  174.                                             tempPLine.AddVertexAt(index, New Point2d(coordinates(index * 2), coordinates(index * 2 + 1)), 0, 0, 0)
  175.                                         Next
  176.                                         tempPLine.Closed = True
  177.                                         closestPt = tempPLine.GetClosestPointTo(PointToTrim, True)
  178.                                     ElseIf entForExtension.ObjectName = "AcDbLine" Then
  179.                                         Dim acdbLine As AcadLine = TryCast(entForExtension, AcadLine)
  180.                                         tempLine = New Line(New Point3d(acdbLine.StartPoint(0), acdbLine.StartPoint(1), 0),
  181.                                                             New Point3d(acdbLine.EndPoint(0), acdbLine.EndPoint(1), 0))
  182.                                         closestPt = tempLine.GetClosestPointTo(PointToTrim, True)
  183.                                     End If
  184.                                     If tempLine IsNot Nothing Or tempPLine IsNot Nothing Then
  185.                                         If Round(PointToTrim.X) - Round(closestPt.X) > 0 Then
  186.                                             dirVec = 1
  187.                                         ElseIf Round(PointToTrim.X) - Round(closestPt.X)  0 Then
  188.                                             dirVec = 1
  189.                                         ElseIf Round(PointToTrim.Y) - Round(closestPt.Y) < 0 Then
  190.                                             dirVec = -1
  191.                                         End If
  192.                                        
  193.                                         ...truncated...you should get the picture by now!
  194.                 lstVerticalLines.Clear()
  195.             End If
  196.             Return curves
  197.         Catch ex As System.Exception
  198.         End Try
  199.     End Function

是的,我的前辈不处理异常是正常的,看到GoTo标签也是正常的。我的前任是(可能现在仍然是)白痴......更准确地说,这主要是由结构工程师写的,他们真的应该坚持自己的职业。请不要告诉我我需要重构这个烂摊子...我有250万行这样的代码要在VB.NET项目和Delphi项目之间处理(请不要问,我不知道为什么)。至少这个函数有注释
那么,回到最初的问题,我是否需要在对象集合中删除该行,然后再重新DIMed?
回复

使用道具 举报

24

主题

204

帖子

6

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2017-7-13 08:49:19 | 显示全部楼层
如果您担心过度分配,DBObjectCollection是可处置的。因此您可以将赋值包装在using语句中,    using(var curves = getnew curves(my documents,slabRegion,updatedSpanLine,localSpanVector,entForExtension,jaggedLine,slabAreaPLine,bStretch,PointToTrim,bIsSlabUpdated))。
{。
//在此使用曲线。
}。
不会,因为变量是在foreach循环的块中定义的,每次迭代都会创建一个新变量,每次循环时,前面的变量都会超出范围。
回复

使用道具 举报

4

主题

219

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
238
发表于 2017-7-13 09:50:29 | 显示全部楼层

在经典VB(5/6/VBA)中,最小的变量范围限制在Sub/Function内。因此,在VBA时代,我们经常看到Sub/Function通常以相当多的Dims行开始,在任何有意义的代码之前声明变量。
然而,在VB.NET(或C#)中,变量的范围可以缩小到逻辑代码块,例如For/while/try... Catch/use块。因此,在循环中声明变量是完全可以的(我还要进一步说它甚至是允许的。也就是说,最好只在必要的最小范围内维护一个vriable)。
但是,不要混淆变量范围和AutoCAD中臭名昭著的要求。NET API处置DBObject您的代码创建但未添加到数据库中。
是的,DBObjectCollection是一次性对象,您可以将其与使用...结束使用块一起使用。但是,它不是DBObject,我们不必显式处置它。我们可以将其留给垃圾收集器来完成它的工作。但是如果它包含您的代码创建的DBObject,那么您需要处理这些DBObject:要么将它们添加到数据库中,要么处置它们。
我没有花太多时间阅读您发布的代码,但它看起来像很多新实体(甚至COM AcadEntity!)将被创建只是为了计算目的,并且它们没有被处置。这就是代码可能存在问题的地方。所以,即使你说“不要告诉你...”,如果我是你,我宁愿引用代码,至少是你在这里显示的代码。
回复

使用道具 举报

21

主题

58

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
142
发表于 2017-7-13 11:28:53 | 显示全部楼层
非常感谢,非常有用。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-4 13:54 , Processed in 0.156882 second(s), 64 queries .

© 2020-2025 乐筑天下

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