乐筑天下

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

在中使用剖面。网

[复制链接]

1

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
6
发表于 2011-3-8 18:28:33 | 显示全部楼层 |阅读模式
对于所有人来说,
我一直在玩.NET中的切片功能,但遇到了一个障碍。
在 AutoCAD 中手动工作时,可以创建剖面(SECTIONPLANE 命令),然后通过在剖面平面上单击鼠标右键,可以创建由剖面平面切割的实体的 2D 剖面。 在设置中,您可以打开背景几何图形并关闭隐藏线,这将创建一个2D部分,该部分显示背景几何图形,但隐藏隐藏在其他实体后面的线。
.NET API 提供对这些相同功能的访问。 但是,我无法实现上述目的。看起来 GenerateSectionGeometry 方法似乎只能应用于一个实体,一次一个。因此,当此方法将背景几何图形的可见性设置为 true 并将隐藏线的可见性设置为 false 时使用,它确实隐藏了实体背面的线条,但实体上应隐藏在另一个实体后面的线条仍然可见。 期望的行为是这些隐藏在实体后面的线不应该是可见的。 此功能是否可以使用 .NET API 实现? 希望如此。
我在下面附上了我的源代码。 如果您看到我做错了什么,请告诉我。
  1. Imports System
  2. Imports Autodesk.AutoCAD.Runtime
  3. Imports Autodesk.AutoCAD.ApplicationServices
  4. Imports Autodesk.AutoCAD.DatabaseServices
  5. Imports Autodesk.AutoCAD.Geometry
  6. Imports Autodesk.AutoCAD.EditorInput
  7. Namespace Autodesk.AutoCAD.SectionTest
  8.     Public Class SOMRClass
  9.          _
  10.         Public Sub SectionTest()
  11.             Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  12.             Dim acCurDb As Database = acDoc.Database
  13.             Dim acDocEd As Editor = acDoc.Editor
  14.             'set up prompt selection options
  15.             Dim acPromptSelOpt As PromptSelectionOptions = New PromptSelectionOptions()
  16.             acPromptSelOpt.MessageForAdding = vbLf & "Select entities to section: "
  17.             acPromptSelOpt.MessageForRemoval = vbLf & "Select entities to remove from selection set: "
  18.             acPromptSelOpt.RejectObjectsFromNonCurrentSpace = True
  19.             'create a typed value array to define the filter criteria, filter for 3dSolids and BlockReferences
  20.             Dim acTypValAr(2) As TypedValue
  21.             acTypValAr.SetValue(New TypedValue(DxfCode.Operator, ""), 2)
  22.             'assign filter criteria to a selectionfilter object
  23.             Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
  24.             'ask the user to select an entity to section
  25.             Dim acSSPrompt As PromptSelectionResult = acDoc.Editor.GetSelection(acPromptSelOpt, acSelFtr)
  26.             If acSSPrompt.Status = PromptStatus.OK Then
  27.                 'save selection set to acSS
  28.                 Dim acSSet As SelectionSet = acSSPrompt.Value
  29.                 'ask the user to select points to be used to define the section plane
  30.                 Dim acPtsColl As Point3dCollection = New Point3dCollection()
  31.                 Dim acPtPrompt As PromptPointResult = acDocEd.GetPoint(vbLf & "Pick first point for section: ")
  32.                 If acPtPrompt.Status = PromptStatus.OK Then
  33.                     acPtsColl.Add(acPtPrompt.Value)
  34.                     Dim acPromptPtOpt As PromptPointOptions = New PromptPointOptions(vbLf & "Pick end point for section: ")
  35.                     acPromptPtOpt.BasePoint = acPtPrompt.Value
  36.                     acPromptPtOpt.UseBasePoint = True
  37.                     acPtPrompt = acDocEd.GetPoint(acPromptPtOpt)
  38.                     If acPtPrompt.Status = PromptStatus.OK Then
  39.                         acPtsColl.Add(acPtPrompt.Value)
  40.                         Try
  41.                             Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  42.                                 'now let's create our section object
  43.                                 Dim acSect As Section = New Section(acPtsColl, Vector3d.ZAxis)
  44.                                 acSect.State = SectionState.Plane
  45.                                 acSect.SetHeight(SectionHeight.HeightAboveSectionLine, 3.0)
  46.                                 acSect.SetHeight(SectionHeight.HeightBelowSectionLine, 1.0)
  47.                                 'get modelspace
  48.                                 Dim acBlkTbl As BlockTable = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
  49.                                 Dim acModelSp As BlockTableRecord = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
  50.                                 'the section must be added to the drwing
  51.                                 Dim acSectObjId As ObjectId = acModelSp.AppendEntity(acSect)
  52.                                 acTrans.AddNewlyCreatedDBObject(acSect, True)
  53.                                 'get the section settings for the section object
  54.                                 Dim acSecSettings As SectionSettings = acTrans.GetObject(acSect.Settings, OpenMode.ForWrite)
  55.                                 'set the section type
  56.                                 acSecSettings.CurrentSectionType = SectionType.Section2d
  57.                                 'get the object ID collection of all entities in the selection set
  58.                                 Dim acObjIdCol As ObjectIdCollection = SS2IdCol(acSSet)
  59.                                 'set the source objects
  60.                                 acSecSettings.SetSourceObjects(SectionType.Section2d, acObjIdCol)
  61.                                 'set all visibility settings to false to start with
  62.                                 acSecSettings.SetVisibility(SectionType.Section2d, SectionGeometry.BackgroundGeometry, False)
  63.                                 acSecSettings.SetVisibility(SectionType.Section2d, SectionGeometry.CurveTangencyLines, False)
  64.                                 acSecSettings.SetVisibility(SectionType.Section2d, SectionGeometry.ForegroundGeometry, False)
  65.                                 acSecSettings.SetVisibility(SectionType.Section2d, SectionGeometry.IntersectionFill, False)
  66.                                 acSecSettings.SetHiddenLine(SectionType.Section2d, SectionGeometry.BackgroundGeometry, False)
  67.                                 acSecSettings.SetHiddenLine(SectionType.Section2d, SectionGeometry.ForegroundGeometry, False)
  68.                                 acSecSettings.SetHatchVisibility(SectionType.Section2d, SectionGeometry.IntersectionFill, False)
  69.                                 'prompt user to select options for the visibility section settings
  70.                                 Dim pKeyOpts As PromptKeywordOptions = New PromptKeywordOptions("")
  71.                                 pKeyOpts.Message = vbLf & "Show background: "
  72.                                 pKeyOpts.Keywords.Add("Yes")
  73.                                 pKeyOpts.Keywords.Add("No")
  74.                                 pKeyOpts.AllowNone = False
  75.                                 Dim pKeyRes As PromptResult = acDocEd.GetKeywords(pKeyOpts)
  76.                                 If pKeyRes.Status = PromptStatus.OK Then
  77.                                     If pKeyRes.StringResult = "Yes" Then
  78.                                         'turn on visibility of background geometry
  79.                                         acSecSettings.SetVisibility(SectionType.Section2d, SectionGeometry.BackgroundGeometry, True)
  80.                                         'The user chose to show background, therefore ask the user whether they want to show hidden lines
  81.                                         Dim pKeyOpts2 As PromptKeywordOptions = New PromptKeywordOptions("")
  82.                                         pKeyOpts2.Message = vbLf & "Show hidden lines: "
  83.                                         pKeyOpts2.Keywords.Add("Yes")
  84.                                         pKeyOpts2.Keywords.Add("No")
  85.                                         pKeyOpts2.AllowNone = False
  86.                                         Dim pKeyRes2 As PromptResult = acDocEd.GetKeywords(pKeyOpts2)
  87.                                         If pKeyRes2.Status = PromptStatus.OK Then
  88.                                             If pKeyRes2.StringResult = "Yes" Then
  89.                                                 'the user chose to show hidden lines
  90.                                                 acSecSettings.SetHiddenLine(SectionType.Section2d, SectionGeometry.BackgroundGeometry, True)
  91.                                             End If
  92.                                         End If
  93.                                     End If
  94.                                 End If
  95.                                 'set generation options
  96.                                 acSecSettings.SetGenerationOptions(SectionType.Section2d, SectionGeneration.SourceSelectedObjects Or SectionGeneration.DestinationNewBlock)
  97.                                 'create a block that will store our generated section drawing
  98.                                 Dim sectblock As BlockTableRecord = New BlockTableRecord()
  99.                                 'set the name of the block to the next available block name in the form "2D_Section_###"
  100.                                 sectblock.Name = GetNextBlkName(acBlkTbl)
  101.                                 'upgrade the blocktable to allow changes
  102.                                 acBlkTbl.UpgradeOpen()
  103.                                 'add the new block to the block table
  104.                                 Dim sectBlockId As ObjectId = acBlkTbl.Add(sectblock)
  105.                                 acTrans.AddNewlyCreatedDBObject(sectblock, True)
  106.                                 For Each acObjId As ObjectId In acObjIdCol
  107.                                     Try
  108.                                         'get the entity, exception occurs heer
  109.                                         Dim acEnt As Entity = acTrans.GetObject(acObjId, OpenMode.ForRead)
  110.                                         'generate the section geometry
  111.                                         Dim flEnts As Array
  112.                                         Dim bgEnts As Array
  113.                                         Dim fgEnts As Array
  114.                                         Dim ftEnts As Array
  115.                                         Dim ctEnts As Array
  116.                                         acSect.GenerateSectionGeometry(acEnt, flEnts, bgEnts, fgEnts, ftEnts, ctEnts)
  117.                                         'add the geometry to the block
  118.                                         For Each flEnt As Entity In flEnts
  119.                                             sectblock.AppendEntity(flEnt)
  120.                                             acTrans.AddNewlyCreatedDBObject(flEnt, True)
  121.                                         Next
  122.                                         For Each bgEnt As Entity In bgEnts
  123.                                             sectblock.AppendEntity(bgEnt)
  124.                                             acTrans.AddNewlyCreatedDBObject(bgEnt, True)
  125.                                         Next
  126.                                         For Each fgEnt As Entity In fgEnts
  127.                                             sectblock.AppendEntity(fgEnt)
  128.                                             acTrans.AddNewlyCreatedDBObject(fgEnt, True)
  129.                                         Next
  130.                                         For Each ftEnt As Entity In ftEnts
  131.                                             sectblock.AppendEntity(ftEnt)
  132.                                             acTrans.AddNewlyCreatedDBObject(ftEnt, True)
  133.                                         Next
  134.                                         For Each ctEnt As Entity In ctEnts
  135.                                             sectblock.AppendEntity(ctEnt)
  136.                                             acTrans.AddNewlyCreatedDBObject(ctEnt, True)
  137.                                         Next
  138.                                     Catch ex As System.Exception
  139.                                         acDocEd.WriteMessage(vbLf & "Error: " & ex.Message)
  140.                                     End Try
  141.                                 Next
  142.                                 'insert the block into model space
  143.                                 Dim insertSuccess As Boolean = InsertSection(sectBlockId)
  144.                                 'commit the transaction
  145.                                 acTrans.Commit()
  146.                             End Using
  147.                         Catch ex As System.Exception
  148.                             acDocEd.WriteMessage(vbLf & "Error: " & ex.Message)
  149.                         End Try
  150.                         
  151.                     End If
  152.                 End If
  153.             End If
  154.         End Sub
  155.         'function to insert the created block into modelspace
  156.         Public Function InsertSection(ByVal acBlkTabRecId As ObjectId) As Boolean
  157.             Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  158.             Dim acCurDb As Database = acDoc.Database
  159.             Dim acEd As Editor = acDoc.Editor
  160.             Dim success As Boolean = True
  161.             Try
  162.                 Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  163.                     Dim pPtRes As PromptPointResult
  164.                     Dim pPtOpts As PromptPointOptions = New PromptPointOptions("")
  165.                     'prompt for the insertion point of the section block
  166.                     pPtOpts.Message = vbLf & "Pick the insertion point for the section block: "
  167.                     pPtRes = acEd.GetPoint(pPtOpts)
  168.                     If pPtRes.Status = PromptStatus.OK Then
  169.                         'extract the point
  170.                         Dim BlkInsertPt As Point3d = pPtRes.Value
  171.                         'create the block reference
  172.                         Dim acNewBlkRef As BlockReference = New BlockReference(BlkInsertPt, acBlkTabRecId)
  173.                         'prompt user for the scale factor
  174.                         Dim pDblRes As PromptDoubleResult
  175.                         Dim pDblOpts As PromptDoubleOptions = New PromptDoubleOptions("")
  176.                         pDblOpts.Message = vbLf & "Enter the scale factor: "
  177.                         pDblOpts.AllowNegative = False
  178.                         pDblOpts.AllowZero = False
  179.                         pDblOpts.DefaultValue = 1
  180.                         pDblRes = acEd.GetDouble(pDblOpts)
  181.                         If pDblRes.Status = PromptStatus.OK Then
  182.                             'calculate the scale factor
  183.                             Dim ScaleFact As Double = pDblRes.Value
  184.                             'create the transformation matrix
  185.                             Dim matTransform As Matrix3d = Matrix3d.Scaling(ScaleFact, BlkInsertPt)
  186.                             'scale the block
  187.                             acNewBlkRef.TransformBy(matTransform)
  188.                             'get modelspace
  189.                             Dim acBlkTbl As BlockTable = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
  190.                             Dim acModelSp As BlockTableRecord = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
  191.                             'add teh block reference to the layout block table record
  192.                             acModelSp.AppendEntity(acNewBlkRef)
  193.                             'add the block reference to the transaction
  194.                             acTrans.AddNewlyCreatedDBObject(acNewBlkRef, True)
  195.                         End If
  196.                     End If
  197.                     'commit the transaction
  198.                     acTrans.Commit()
  199.                 End Using
  200.             Catch ex As System.Exception
  201.                 acEd.WriteMessage(vbLf & "Error:" & ex.Message)
  202.                 success = False
  203.             End Try
  204.             Return success
  205.         End Function
  206.         'function to take a selectionset and return an object id collection
  207.         Private Function SS2IdCol(ByVal acSSet As SelectionSet) As ObjectIdCollection
  208.             Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  209.             Dim acCurDb As Database = acDoc.Database
  210.             Dim acDocEd As Editor = acDoc.Editor
  211.             Dim acOBjIdColl As ObjectIdCollection = New ObjectIdCollection()
  212.             Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  213.                 For Each acSSObj As SelectedObject In acSSet
  214.                     acOBjIdColl.Add(acSSObj.ObjectId)
  215.                 Next
  216.             End Using
  217.             Return acOBjIdColl
  218.         End Function
  219.         'function to get the next available block name in the form "2D_Section_###"
  220.         Private Function GetNextBlkName(ByVal acBlkTable As BlockTable) As String
  221.             Dim startString As String = "001"
  222.             Do While acBlkTable.Has("2D_Section_" & startString)
  223.                 Dim nextInt As Integer = CInt(startString) + 1
  224.                 startString = nextInt.ToString("000")
  225.             Loop
  226.             startString = "2D_Section_" & startString
  227.             Return startString
  228.         End Function
  229.     End Class
  230.        
  231. End Namespace

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

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

使用道具 举报

1

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
9
发表于 2011-3-13 15:09:32 | 显示全部楼层
为了获得一个部分,您可以使用“部分”对象。 有了这个,您可以处理更多的固体。
有些像这样
  1. Autodesk.AutoCAD.DatabaseServices.Section se = new Section(ptsez, asseverticale);
  2.                         se.TopPlane = limiteSup;
  3.                         se.BottomPlane = limiteInf;
  4.                         Array ents;
  5.                         using (Transaction tr = d.Database.TransactionManager.StartTransaction())
  6.                         {
  7.                             // creazione linea sezione
  8.                             BlockTable bt = (BlockTable)tr.GetObject(d.Database.BlockTableId, OpenMode.ForRead);
  9.                             BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  10.                             btr.AppendEntity(se);
  11.                             tr.AddNewlyCreatedDBObject(se, true);
  12.                             // riapertura oggettoa
  13.                             se = tr.GetObject(se.ObjectId, OpenMode.ForWrite) as Section;
  14.                             se.State = SectionState.Plane;
  15.                             //---------SETTAGGI SEZIONE
  16.                             SectionSettings ss = (SectionSettings)tr.GetObject(se.Settings, OpenMode.ForWrite);
  17.                             // Impostazione tipo sezione
  18.                             ss.CurrentSectionType = st;
  19.                             // We only set one additional option if "Live"
  20.                             if (st == SectionType.LiveSection)
  21.                                 se.EnableLiveSection(true);
  22.                             else
  23.                             {
  24. Autodesk.AutoCAD.DatabaseServices.Section se = new Section(ptsez, asseverticale);
  25.                         se.TopPlane = limiteSup;
  26.                         se.BottomPlane = limiteInf;
  27.                         Array ents;
  28.                         using (Transaction tr = d.Database.TransactionManager.StartTransaction())
  29.                         {
  30.                             // creazione linea sezione
  31.                             BlockTable bt = (BlockTable)tr.GetObject(d.Database.BlockTableId, OpenMode.ForRead);
  32.                             BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  33.                             btr.AppendEntity(se);
  34.                             tr.AddNewlyCreatedDBObject(se, true);
  35.                             // riapertura oggettoa
  36.                             se = tr.GetObject(se.ObjectId, OpenMode.ForWrite) as Section;
  37.                             se.State = SectionState.Plane;
  38.                             //---------SETTAGGI SEZIONE
  39.                             SectionSettings ss = (SectionSettings)tr.GetObject(se.Settings, OpenMode.ForWrite);
  40.                             // Impostazione tipo sezione
  41.                             ss.CurrentSectionType = st;
  42.                             // We only set one additional option if "Live"
  43.                             if (st == SectionType.LiveSection)
  44.                                 se.EnableLiveSection(true);
  45.                             else
  46.                             {
  47.                                 // Non-live (i.e. 2D or 3D) settings
  48.                                 ObjectIdCollection oic = new ObjectIdCollection();
  49.                                 idsolido = B2UtilCad.b2Handle.GetHandleAsObjectID(d, hnOggettoDaSezionare);
  50.                                 oic.Add(idsolido);
  51.                                 ss.SetSourceObjects(st, oic);
  52.                                 if (st == SectionType.Section2d)
  53.                                 {
  54.                                     // 2D-specific settings
  55.                                     ss.SetVisibility(st, SectionGeometry.BackgroundGeometry, true);
  56.                                     ss.SetHiddenLine(st, SectionGeometry.BackgroundGeometry, false);
  57.                                 }
  58.                                 else if (st == SectionType.Section3d)
  59.                                 {
  60.                                     // 3D-specific settings
  61.                                     ss.SetVisibility(st, SectionGeometry.ForegroundGeometry, true);
  62.                                 }
  63.                                 // Finish up the common 2D/3D settings
  64.                                 ss.SetGenerationOptions(st, SectionGeneration.SourceSelectedObjects | SectionGeneration.DestinationFile);
  65.                             }
  66.                                 ObjectIdCollection oic = new ObjectIdCollection();
  67.                                 idsolido = B2UtilCad.b2Handle.GetHandleAsObjectID(d, hnOggettoDaSezionare);
  68.                                 oic.Add(idsolido);
  69.                                 ss.SetSourceObjects(st, oic);
  70.                                 if (st == SectionType.Section2d)
  71.                                 {
  72.                                  
  73.                                     ss.SetVisibility(st, SectionGeometry.BackgroundGeometry, true);
  74.                                     ss.SetHiddenLine(st, SectionGeometry.BackgroundGeometry, false);
  75.                                 }
  76.                                 else if (st == SectionType.Section3d)
  77.                                 {
  78.                                     
  79.                                     ss.SetVisibility(st, SectionGeometry.ForegroundGeometry, true);
  80.                                 }
  81.                                 
  82.                                 ss.SetGenerationOptions(st, SectionGeneration.SourceSelectedObjects | SectionGeneration.DestinationFile);
  83.                             }

回复

使用道具 举报

1

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
6
发表于 2011-3-15 15:40:11 | 显示全部楼层
亲爱的bikelink,
我很抱歉,但是,从您的代码示例中,我看不出您对partule对象的实现解决了我的问题(或者与我在代码中所做的不同)。 也许你给我的代码示例是不完整的。 也许你可以解释更多。
我的代码适用于关闭背景几何图形时多个实体的 2d 部分。 它不做的是隐藏在打开背景几何图形时应隐藏在其他实体后面的线条(并且隐藏线可见性设置为 false)。 这就是我想要实现的目标。
谢谢,
回复

使用道具 举报

1

主题

8

帖子

1

银币

初来乍到

Rank: 1

铜币
12
发表于 2019-11-27 08:59:43 | 显示全部楼层
您好,
很抱歉挖出了那个老话题,但这个问题似乎仍未解决<有人找到解决办法了吗?将不胜感激。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2024-11-22 05:09 , Processed in 0.257275 second(s), 60 queries .

© 2020-2024 乐筑天下

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