乐筑天下

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

VBA中的AutoCAD真彩色对话框?

[复制链接]

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2007-9-15 00:24:56 | 显示全部楼层 |阅读模式
我有这个代码,我通过使用aced. h中定义的原始命令将其移植到VBA。类型似乎是正确的,除非当然我错过了一些非常巨大的东西。这些努力总是给AutoCAD带来致命的错误...当然,我知道这不是首选方法,但我真的很想拥有这个颜色对话框界面。
这是代码
  1. ' This is the definition of acedSetColorDialogTrueColor as found in aced.h
  2. ' acedSetColorDialogTrueColor(
  3. '    AcCmColor& color,
  4. '    Adesk::Boolean bAllowMetaColor,
  5. '    const AcCmColor& curLayerColor,
  6. '    AcCm::DialogTabs tabs = (AcCm::DialogTabs)(AcCm::kACITab | AcCm::kTrueColorTab| AcCm::kColorBookTab));
  7. '
  8. '   My understanding is that AcCmColor& is a pointer to the AcCmColor object(AcadAcCmColor in VBA)
  9. '   Constants are directly from aced.h
  10. Private Declare Function acedSetColorDialogTrueColor Lib "acad.exe" (ByVal pColor As Long, _
  11. ByVal bAllowMetaColor As Boolean, ByVal pCurLayerColor As Long, ByVal DialogTabs As Integer) As Boolean
  12. Private Const kACITab = 1
  13. Private Const kTrueColorTab = 2
  14. Private Const kColorBookTab = 4
  15. Public Function GetAcadTrueColor(MtaCol As Boolean) As Object
  16.   Dim SelectColor As AcadAcCmColor 'This is returned from the call
  17.   Dim LayColor As New AcadAcCmColor ' This is sent to the call, thus I initialize it first without regard to the color
  18.   On Error Resume Next
  19.   If acedSetColorDialogTrueColor(ObjPtr(SelectColor), MtaCol, ObjPtr(LayColor), kACITab Or kTrueColorTab Or kColorBookTab) Then
  20.     Set GetAcadTrueColor = SelectColor 'return AcadAcCmColor
  21.   End If
  22. End Function

我已经看到许多其他人也会喜欢这个功能的地方,所以如果它能准确完成,那将是一件好事。

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

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

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-9-15 13:26:44 | 显示全部楼层
我在这里没有看到objPtr,但无论我尝试什么,我都崩溃了。
Keith,顺便说一句,
如果api暴露给C++它是否一定暴露给其他程序。
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2007-9-15 16:00:22 | 显示全部楼层
基思;
我知道你会说俄语,也会读俄语,所以也许你会在这里找到一些有用的东西:
http://www.autocad.ru/cgi-bin/f1/board.cgi?t=4258zJ
HTH
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2007-9-16 10:50:43 | 显示全部楼层
Luis,
这似乎不起作用。至少在2007年。我更改了类型并以多种方式调整了调用,最终结果总是一个致命的错误。
回复

使用道具 举报

6

主题

103

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
127
发表于 2007-9-16 15:41:35 | 显示全部楼层
是的,我尝试了用我对VBA的一点知识…并且得到了致命错误
如果您使用例如C#,它非常简单…
  1. [CommandMethod("COLORDLG")]
  2. public void colordlg()
  3. {
  4.     Document doc = acadApp.DocumentManager.MdiActiveDocument;
  5.     Editor ed = doc.Editor;
  6.     ColorDialog dlg = new ColorDialog();
  7.     if (dlg.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
  8.     Autodesk.AutoCAD.Colors.Color clr = dlg.Color;
  9.     ed.WriteMessage("\nColor selected is [{0}]", clr.ToString());
  10. }

回复

使用道具 举报

116

主题

996

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1466
发表于 2007-9-18 08:44:18 | 显示全部楼层
路易斯,我开始认为错误是由于VBA和AutoCAD之间的数据类型的转换。你认为有可能建立一个我可以在VBA引用和调用的activex dll吗?
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2007-9-18 10:50:58 | 显示全部楼层

可能是......关于activex,我从来没有做过...
这是其他人使用Frank O.类调用lisp函数所做的,可能会有所帮助(您可能知道)......
  1. Public Function AcadColorDialog() As Integer
  2.     'calls the acad color dialog and returns
  3.     'the index of the color selected or -1 if cancelled
  4.     Dim i As Integer
  5.     Dim vl As New VLAX
  6.    
  7.     'call color dialog
  8.     vl.EvalLispExpression ("(setq clr (acad_colordlg 1))")
  9.     'if dialog was canceled, clr will be nil, set to -1 instead
  10.     i = vl.EvalLispExpression("(if (= clr nil)(setq clr -1)(setq clr clr))")
  11.     AcadColorDialog = i
  12.     Set vl = Nothing
  13. End Function
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2007-9-18 13:13:59 | 显示全部楼层
基思;
我把这个代码给了一个朋友,用A2006进行测试,并工作,但在A2008上崩溃了。我在A2007和A2005中测试了这里,并得到了漂亮的崩溃
只是一个小小的改变:
AllowMetaColor As Boolean
被制作出来了....
  1. Option Explicit
  2. Type tColor
  3.    NotKnow As Long
  4.    Color As Long
  5.    ColorName As Long
  6.    ColorBook As Long
  7. End Type
  8. Private Declare Function acedSetColorDialogTrueColor Lib "acad.exe" _
  9.   (ByRef Color As tColor, ByVal AllowMetaColor As Boolean, _
  10.    ColorCurrent As tColor, ByVal ColorSystems As Byte) As Byte
  11. Sub DlgTrueColor()
  12. Dim Color As AcadAcCmColor
  13. Dim AllowMetaColor As Boolean
  14. Dim ColorSystems As Byte
  15. Dim Result As Byte
  16. Dim ColorOld As Long
  17. Dim ColorLong As tColor, ColorCurrent As tColor
  18.    With ColorLong
  19.       .NotKnow = 1691390208
  20.       .Color = -1024366560
  21.       .ColorName = 0
  22.       .ColorBook = 0
  23. End With
  24.    With ColorCurrent
  25.       .NotKnow = 1691390208
  26.       .Color = -1023410169
  27.       .ColorName = 0
  28.       .ColorBook = 0
  29.    End With
  30.    AllowMetaColor = True
  31.    ColorSystems = 7
  32.    On Error Resume Next
  33.    ColorOld = ColorLong.Color
  34.    Result = acedSetColorDialogTrueColor(ColorLong, AllowMetaColor, ColorCurrent, ColorSystems)
  35. On Error GoTo 0
  36.    If ColorLong.Color = ColorOld Then
  37.       MsgBox "!", vbExclamation
  38.     Else
  39.       Set Color = Application.GetInterfaceObject("AutoCAD.AcCmColor.16")
  40.       Color.EntityColor = ColorLong.Color
  41.       If Color.ColorMethod = acColorMethodByRGB Then
  42.          MsgBox ": " & Chr(13) & Chr(10) & _
  43.            "   : RGB — " & Color.ColorMethod & Chr(13) & Chr(10) & _
  44.            "   : R" & Color.Red & ":G" & Color.Green & ":B" & Color.Blue, vbInformation
  45.        Else
  46.          MsgBox ": " & Chr(13) & Chr(10) & _
  47.            "   : ACI — " & Color.ColorMethod & Chr(13) & Chr(10) & _
  48.            "   : " & Color.ColorIndex, vbInformation
  49.       End If
  50.    End If
  51. End Sub

回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2007-9-18 14:04:01 | 显示全部楼层

谢谢Luis,
有了Frank Oquendo的VLAX课程,这在2007年对我来说就像是一次穿梭
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2007-9-18 22:13:55 | 显示全部楼层

不客气!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-6 01:17 , Processed in 0.718567 second(s), 72 queries .

© 2020-2025 乐筑天下

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