哪位高手能帮我找到声卡节点的uipath 简介map

帖子很冷清,卤煮很失落!求安慰
手机签到经验翻倍!快来扫一扫!
哪位高手能将直插运放焊接到声卡的贴片运放位置
1746浏览 / 17回复
现在声卡上的运放基本是贴片的运放,实际上,更换运放往往对声卡的音色和素质可以起到提升的作用,但是贴片运放那点小焊脚,怎么焊上直插运放?
如果有哪位高手能开发一种转接插槽,能焊接到声卡的贴片位置,上面保持直插运放的插脚,就会使得声卡的DIY更加具有乐趣。方便的更换运放,找到自己喜欢的音色。
我想这样的产品肯定好卖,但是全中国我找遍没有发现,哪位高手开发一下这种焊接转接,通知我一下,只要做工好,我愿意50元买呀。这个产品应该很有市场的。
我靠,没有这个装置,好多运放,想试试太难了,每次尝试,都要焊,想借借运放听听都不好意思开口。买一大堆贴片运放,以后用到其它上都还要再转接。
太贪心了吧?贴片是为了生产工艺,你想换一片也不容易,还想换来换去?
对&1楼&…问天…&说:=========================如果能有转接就好了。呵呵。没人开发,这个不算难吧。比什么CPU转接容易多了吧。
对&2楼&自由~自在&说:=========================晕!CPU转接卡是有利可图,主板和U都值好多的钱呀。
你自己开发好了,对于我来说太高深,跟本不懂。
不会吧lZ也太搞笑了,你不要指望所有运放都和5532
AD827 那样低电压下也OK ,这种无聊的东西傻瓜才会去做。
对&5楼&_npn&说:=========================
注册个小号就嘲笑别人,讨论问题欢迎,骂人的请你自重,我声卡+-12V供电的,你以为天下声卡全是+-5V供电。懂多了也请你尊重别人,就是别人真是傻子,你笑话别人,就显得你智商高了?
对&6楼&自由~自在&说:=========================我又没嘲笑你,请不要给自己扣帽子好么?~+ -5V只是个例子 你以为+ -12V 就很OK? 估计你的那些卡上 只不过些 好点的op275之流 换的高点的AD827别以为+ -12V就很好 有多少hi人在听+ -15V的5532又有多少人用15V 827 ?声卡上的DAC不好就算换上不斐的OPA2111 也只是音色的变化好点是声音大了不过如此。你以为你这种无知化妆高深? 在举个例子OOAOO 就有SQ680 就带运放插座,声音好到哪里去了???另,你论坛混的少了就说人家换小号?
对&7楼&_npn&说:=========================难道不是很多运放在+-12V处在最佳工作区间?没讨论DAC的好坏!就是DAC不好,如果方便,我也愿意换着听。你真有知,你愿意听5532,就在家听80年代的5532,15V听呀,没人拦你。真是的!没人请你跟贴,不愿意看,远远的去!
对&8楼&自由~自在&说:=========================你虽然是搂主但跟不跟帖不是你说的算。给你个连接:http://bbs.audio-gd.com/dispbbs.asp?boardID=2&ID=168 你难道不知道为什么声卡上不用5V就用12V的道理?OK!我告诉你,因为电脑的开关电源只有适合运放的正负5V 和正负12V 。运放与运放的外围元件是有规定的,只有在这种条件下才能达到厂商预期的性能。在告诉你个例子一块op275 即使没有外围元件只要加上合适的电压,接入输入输出一样能出声,只不过声音很差罢了。自己不行还在这里卖弄,换个运放就自己听出Hi了,这样OPA2111都满足不了你了。还是劝你提高一下自己的水平,在这里一些菜鸟还以为多么高深多么渊博呢...
对&9楼&_npn&说:=========================不用你告诉我,还冒充专家,我自己不行,你怎么行?你行行我看看?就是一个熟鸭子——嘴硬,就知道到网上搜搜弥补自己的漏洞,+-12V能满足诸多运放的最佳工作电压区间你知道吗?,你以为运放工作电压就是一个点?我看你不是太有知,是太幼稚了,换上听怎么了?好听不好听,你磨过我的声卡吗?就在这里冒充最新专家,别人DIY,你在这里对跟贴的网友极尽嘲笑、讽刺之词。看得到你的水平和你的素质一样,不是一般的低,那家伙,那是相当的低~~~人家都是菜鸟,你是老鸟!
对&10楼&自由~自在&说:=========================虽然我不是老鸟但比起你这种无知的菜鸟强多了,请你到别的除了ZOL 例如erji
pchifi 等上去看看就知道你这种无知简直不值反驳(+ -12V的问题) 讽刺那种不明白还瞎卖弄的 嘲笑的是那种“傻瓜”式 摩卡的装~分子,果真如此ZOL的确有您这样一批人。希望阁下到稍好点的地方发发你的言论看看抨击你的有多少人?
对&11楼&_npn&说:=========================我们都是菜鸟,我的文章版主加精就是跟着瞎起烘的菜鸟,这么菜的版,还舍不得离开?中关村的版不专业也来?见过狂的,没见过你这么颠屁+狂的。什么都说不出来,就知道反复那两句话。运放都要在+-15V工作?我就不信了,你什么专家理论,你发明的都必须15V?我只知道,很多运放的最佳工作电压区间包括+-12V。
还叫我去搜搜,回不了专业词汇就让我搜搜?到别的论坛?你真是小白的可以你那么专业,发几个原创精贴看看?中关村的声卡和音箱就是欢迎我这样的一批发帖讨论的人,但很不幸不包括阁下!你菜的不是一般,看看你可怜的经验值,连基本的运放工作电压是一个区间都搞不清楚,傻的可怜!
对&11楼&_npn&说:=========================你不但傻的可怜,还误导大家!谁都知道换运放一定要查看官方公布的运放参数,确定自己的电路的工作电压,然后看看能不能换。你什么都不知道,就知道+-15V下才能换运放?14.8V就不行了?14v就不行了?你以为运放是定时炸弹,差一点都不行呀?!告诉你这个小白,运放从来都是公布一个最佳工作电压区间,而且+-12v处于很多运放的最佳工作区间。
你菜的真是可以,顶级双运放之一AD8620 BRZ如果放到你的+-15V就烧了!光知道用一张硬嘴瞎吹,实在是我最最看不起的那一类!!
就只会说凡是+-12V换运放的都是超级菜鸟,那+-5V换的还不让你给揣死?
天下声卡磨运放的都和我一样,是你眼里的菜鸟,你是天使呀?!
我认为没必要!如确实想改善音质的话,最好还是用万用板做一块,信号线直接引到那块板上就可以了,如电压不合适,可用三端稳压做一个,想要精确一点的,可使用运放进行伺服跟踪。周边元件对音质影响也很大,可考虑音频专用元件,如WIMA 等不过再怎么摩,电脑音质始终比不上音频专用设备,所以只要能过得去就行了。
好激烈,插句话.我更菜,好像有贴片式的运放吧,即使找不到,也可以把直插式运放的脚稍微加工一下就行了,我的LG DVD里的三块运放都是这样换的
很好换的哇,先把印刷版的焊锡用吸锡线刮干净,把需要装上去的贴片对准,注意不要弄反了!用焊锡丝直接焊联锡不要管他,最后用吸锡线把多余的锡刮掉就好啦。
用户名/注册邮箱/注册手机号
其他第三方号登录黑苹果定制声卡驱动(ALC892为例) - 简书
黑苹果定制声卡驱动(ALC892为例)
教程以ALC892为例,主要针对笔记本的声卡。由于笔记本声卡经常同一型号的声卡驱动并不能通用,往往需要自己定制。台式机大多没有这个问题,只需要用AppleALC-master生成通用声卡即可,通用声卡不好用的可以借鉴本篇文章的思路。(台式机或者嫌麻烦的,可以直接跳到第八节,直接进行编译,如果不完美再进行定制)
一、定制驱动目标文件
二、定制声卡信息提取
三、所需工具
四、codec提取方法
五、修改configdata信息
六、推导节点及Platforms.xml修改
七、制作辅助文件
八、编译声卡驱动
九、实现声卡驱动
一、定制驱动目标文件
完全自制声卡驱动,主要是要制作4个文件:
1.Applealc-master——resources——alc892中Platforms.xml.zlib(节点文件)
2.Applealc-master——resources——alc892中layout1.xml.zlib(layoutID文件)
3.Applealc-master—&resources—&alc892—&info.Plist
(描述声卡以及对layout和Platforms文件位置、id的说明)
4.Applealc-master—&resources—&pinconfigs.kext—&contents—&info.Plist
(包含codecID和layoutID相关值)
二、定制声卡信息提取
1、提取声卡codec
2、verbit获取你的声卡configdata和节点信息
3、推导自己的Platforms节点
三、所需工具
1、Ubuntu系统。
将codec生成verbs.txt文件。
3、zlib转换器
4、AppleALC-master声卡驱动
需要最新lilu.kext配合,并且需要完整lilu才行(lilu中不能缺少Resources文件夹)
四、codec提取方法
1、U盘安装Ubuntu系统
网上很多需要在U盘中写入镜像,其实现在的Ubuntu也有类似WinPE的功能,将下载好的安装包解压到U盘中即可。新版ubuntu出现了解压后无法引导的情况,用制作U盘启动盘的方法把镜像写入U盘就可以(记得提前把U盘数据转移,会格盘的)。
开机启动时引导进入U盘的Ubuntu系统
出现Ubuntu的系统选项,选择Try Ubuntu without installing
ubuntu系统选项.jpg
进入Ubuntu系统的桌面打开我的电脑,进入路劲proc/asound/card1,将文件夹里面的所有名为codec#开头的文件都复制出来,其中一个就是你的声卡codec,千万不要把HDMI音频的文件复制出来了(如果card1没有就一定在card0文件夹,笔记本一般都在card1中)
2、进入macOS系统中,将提取的Codec.txt改名为codec_dump.txt放在桌面上,将verbit.zip解压到桌面,打开终端输入:
cd desktop
./verbit codec_dump.txt & verbs.txt
获得verbs.txt(部分朋友获取的为空白,是因为两个命令一起使用的结果)
注意:部分声卡终端输入命令会得到一个错误文件,
文件的内容如下:
Codec: Realtek ALC269VC
Address: 0
AFG Function Id: 0x1 (unsol 1)
需要删除codec_dump.txt文件中的这行数据AFG Function Id: 0x1 (unsol 1),也要把空格删除完。再执行一次命令,得到正确的verbit.txt文件。(感谢Lenged发现问题)
打开codec.txt搜索上面的红框中的Node,找到每个Node下面的Pin Default那行,看看中间是否有[N/A],将有[N/A]的将“节点信息”中的一行删除。
删除后,红框中的modified verbs每行四个数,一共7组就是需要的configdata(codec.txt内搜索EAPD字样,存在EAPD,必须在configdata最后加入一组01470C02)
五、修改configdata信息
第一组.png
红框中是接口的顺序。数字越低那么优先权就越高。如果有 [N/A] 的接口既是无用的接口可以设成 f。
内置麦克风
—— Mic at Int N/A
内置扬声器
——Speaker at Int N/A
—— line out
外置麦克风
—— Mic at Ext Rear
Line In at Ext Rear
HP Out at Ext Rear
—— SPDIF Out at Ext Rear
如果你的声卡有line out 节点那么
Mic at Int N/A
Speaker at Int N/A
Mic at Ext Rear
Line In at Ext Rear
HP Out at Ext Rear
SPDIF Out at Ext Rear
如果无line out则
Mic at Int N/A
HP Out at Ext Rear =2
Mic at Ext Rear = 5
Line In at Ext Rear =4
Speaker at Int N/A
SPDIF Out at Ext Rear
(耳机优先级一定要低于内置扬声器,外置麦克风一定要低于内置麦克风,默认开启的是内置扬声器和麦克风,第四组数据把耳机设置为0,既插入检测。这样就可以实现自动切换了。)
第二组.png
line out设置为f,其余皆为0
第三组.png
第三组为接口颜色,这个改不改无所谓,我是默认没改
0 = Unknown
6 = Orange
7 = Yellow
8 = Purple
A - D = Reserved
第四组.png
接口为 0,表示当接口被检测到时使用。如果是笔记本的话内建的麦克风和扬声器要设成1,即当耳机插入时,内建扬声器静音,耳机0 接口被检测到就是用耳机。
Mic at Int N/A
Speaker at Int N/A
Mic at Ext Rear
Line In at Ext Rear
HP Out at Ext Rear
SPDIF Out at Ext Rear
第五组.png
设定接口功能信息,按照以下进行修改
0 = Line Out
1 = Speaker
2 = HP Out
4 = SPDIF Out
5 = Digital Other Out
6 = Modem Line Side
7 = Modem Handset Side
8 = Line In
A = Mic In
B = Telephone
C = SPDIF In
D = Digital Other In
E = Reserved
Mic at Int N/A
Speaker at Int N/A
Mic at Ext Rear
=8(ALC892需要通过line in实现外置mic)
Line In at Ext Rear
HP Out at Ext Rear
SPDIF Out at Ext Rear
第六组.png
连接装置类型
0 = Unknown
1 = 1/8" stereo/mono
2 = 1/4' stereo/mono
3 = ATAPI internal
5 = Optical
6 = Other Digital
7 = Other Analog
8 = Multichannel Analog (DIN)
9 = XLR/Professional
A = RJ-11 (Modem)
B = Combination
通常接口是 1/8" stereo/mono,SPDIF 是 Optical。笔记本内建的接口是 ATAPI internal。(这只是描述,对驱动没有本质影响,我默认没有修改。)
第七组.png
0为插入接口的,如外置麦克风、耳机等。
(如果codec_dump出来有 [N/A] 的就是无用的port,数字为4。)
9为给笔记本內建,像内置扬声器、内置麦克风等
Mic at Int N/A
Speaker at Int N/A
Mic at Ext Rear
Line In at Ext Rear
HP Out at Ext Rear
SPDIF Out at Ext Rear
第八组.png
插口所在位置
0 = Rear(后)
1 = Front(前)
9=ATAPI (內建)
(这只是描述,对驱动没有本质影响,我默认没有修改。)
将八组数据修改后进行整理得到configdata值(每个参数中保留一位空格):
71d01 071f90 71d01 71f90 71d10 71f01 71d10 071f01 01a71c50 01a71d10 01a71e81 01a71f01 01b71c30 01b71d10 01b71e21 01b71f01 01e71c40 01e71d11 01e71e45 01e71f01 01470C02
六、推导节点及Platforms.xml修改
1、推导节点
接口的节点信息.png
红框中为接口节点。
想要实现接口功能需要推导节点,一般为3个节点实现一个接口功能,且节点一般不重复。其中输入为反向推导,输出为正向推导,即输入时接口节点是最后一个节点,输出时接口节点是第一个节点(codec中的节点值为16进制,Platforms.xml中需要转换成10进制)
①输入以Mic at int(内置麦克风)为例在codec_dump.txt搜索0x12,
搜索到2个0x12,一个为节点本身即Node 0x12,一个在关联节点0x22下
0x22节点.png
0x12节点.png
然后在codec_dump.txt搜索0x22,搜索到2个0x22,一个为节点本身即Node 0x22,一个在关联节点0x09下
0x09节点.png
0x22节点.png
按照输入节点反向推导,获得内置麦克风的节点为:
十六进制:0x09 → 0x22 → 0x12
十进制:9 → 34 → 18
②输出以Speaker at Int N/A(内置扬声器)为例在codec_dump.txt搜索0x14,
搜索到4个0x14,首先找到节点本身即Node 0x14
0x14节点.png
找到connection中有关联节点0x0c
在codec_dump.txt搜索0x0c,搜索到6个0x0c,首先找到节点本身即Node 0x0c
0x0c节点.png
找到connection中有关联节点0x02,0x0b,在已选节点不重复的前提下,优先选择数字小,即0x02节点
按照输出节点正向推导,获得内置扬声器的节点为:
十六进制:0x14 → 0x0c → 0x02
十进制: 20 → 12 → 2
由此推导出所有节点,由于节点很多,可能出现有共同关联的节点,且没有其他节点,则更换上个节点,重新推导,直到没有重复的为止。
2、修改Platforms.xml
根据我的Platforms.xml进行修改即可
PathMap下一共三大项:
0为输入(第一输入项,外置mic可以实现自动切换的只需要一个输入项,无法实现的需要第二输入项),1为输出(第一输出项),2为SPDIF
输入项分为三大项:
0为内置mic,1为linein,2为外置mic(ALC892外置mic通过linein实现,由此删除外置mic项)
输出项分为三大项:
0为耳机,1为内置扬声器,2位lineout
以内置mic为例:内置mic底层三项代表三个节点,将之前推导的三个节点按顺序输入到NodeID中,在内置mic节点添加boost项(设置电平增效数值为1、2、3,数值3最大),设置为3,可以减少mic杂音的情况(外置mic和linein的节点也可以添加boost项)
内置mic.png
部分机器会出现插入外置mic不识别的情况,其实只是外置mic无法自动切换导致无法显示出来,需要调整将节点到第二类输入项中来实现手动切换,如图
外置mic节点接口
以此类推,所有节点修改完毕后,在PathMapID中输入你的声卡型号,Platforms.xml完毕,保存后用zlib转换器转换成Platforms.xml.zlib格式。
七、制作辅助文件
1、Applealc-master——resources——alc892中的info.Plist
用来描述你的声卡以及对layout和Platforms文件位置、id的说明
ALC892的codecID为,这是0x10ec0892十六进制转换过来的。在codec_dump开头中可以找到,macos的计算器有进制转换功能。
然后修改layouts第一项,修改id为1,path地址改为你做好的layouts.xml.zlib文件,Platforms设置方式一样。(全篇LayoutID统一为1,也可统一为其他数字)
2、Applealc-master——resources——pinconfigs.kext——contents中的info.Plist
集合了所有声卡的信息,我们只用保留需要的,为防止冲突,只修改第一项,其他都可以删除。第一项中修改codec为alc892,codecID为,这是0x10ec0892十六进制转换过来的。在codec_dump开头中可以找到,macos的计算器有进制转换功能。configData中修改为自己的configdata即可。LayoutID修改为1(全篇LayoutID所有统一为1,也可统一为其他数字)
3、Applealc-master——resources——alc892中layout1.xml.zlib
描述声卡型号以及声卡ID信息
首先向zlib文件转换为xml文件才可以编辑
LayoutID修改为1(全篇LayoutID所有统一为1,也可统一为其他数字),修改codecID为,这是0x10ec0892十六进制转换过来的。在codec_dump开头中可以找到,macos的计算器有进制转换功能。
pathmapID修改为892。部分声卡需要删除lineout项才能驱动,需要自行尝试。
layout.png
外置mic需要修改电压控制值来实现外置mic驱动。
搜索codec中外置mic下的vref值,vref含义为初始电压基础上增加的百分比,如图为vref为50。当vref不为Hiz时,muteGPIO={(vref转换为16进制)+"0100"+node id}转换为10进制,codec中vref表示的是十进制,计算时转为16进制。如:在节点 0x18发现vref_50,50转换为16进制=32,则muteGPIO=()转换为10进制=;如果vref为Hiz,则muteGPIO=0
vref值.png
由于外置mic需要通过linein实现,因此修改linein中的muteGPIO为
muteGPIO值.png
最后确认一共需要修改和定制的为4个文件:
1.Applealc-master——resources——alc892—&Platforms.xml.zlib
2.Applealc-master——resources——alc892—&layout1.xml.zlib
3.Applealc-master—&resources—&alc892—&info.Plist
4.Applealc-master—&resources—&pinconfigs.kext—&contents—&info.Plist
全篇所有的layoutID都为1,如果需要修改其他数字,需要注意layout文件名也需要修改,如layout25.xmI.zlib
这四个文件保存好以后,系统升级驱动失效时可获取最新的AppleALC-master文件重新编译即可,十分方便。
八、编译声卡驱动
下载好最新的AppleALC-master文件,由于10.12.6之后需要lilu.kext才能编译并驱动声卡,还需要下载最新的lilu.kext放置在AppleALC-master的根目录,需要注意的是lilu.kext中必须包含有Resources(部分lilu.kext缺少该文件)
将之前定制好的四个文件,放置在对应的位置,运行AppleALC-master中的AppleALC.xcodeproj
运行xcode.png
如果出现红色叹号报错,可能出现以下问题:
1、缺少lilu.kext文件或lilu.kext中缺少resources下的文件(查找最新lilu.kext,并确保必须包含有Resources)
2、显示缺少liluAPI,说明lilu.kext与AppleALC-master版本不对应,在下载时确保最新或者版本说明中相互对应,确保相互兼容。
九、实现声卡驱动
将做好驱动和对应版本的lilu.kext放到EFI—&CLOVER—&kexts—&10.13文件夹中。
然后在config.plist中加入以下代码:
&key&Audio&/key&
&key&Inject&/key&
&string&1&/string&
clover注入ID不能让这个声卡驱动正常工作所以这里必须采用DSDT注入ID
打开DSDT搜索HDEF插入函数
Method (_DSM, 4, NotSerialized)
// _DSM: Device-Specific Method`
Store (Package (0x0A)
"hda-gfx",
Buffer (0x0A)
"onboard-1"
"codec-id",
Buffer (0x04)
0x92, 0x08, 0xEC, 0x10 //修改为自己的声卡型号
"layout-id",
Buffer (0x04)
0x01, 0x00, 0x00, 0x00//修改为自己的layoutID
"device-type",
Buffer (0x07)
"ALC892"//修改为自己的声卡型号
"PinConfigurations",
Buffer (Zero) {}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
以这种仿冒方式定制的声卡,对于笔记本十分友好,同时也能很好的解决唤醒无声以及杂音问题。以上教程是通过学习远景贴并总结个人经验写成的,我个人定制声卡驱动后没有出现唤醒无声以及杂音等问题,如果由以上问题没有解决的,可以参考一下帖子参考。这里附上原贴,以及我个人的帖子电脑没声音了,用诊断工具检查没有找到声卡。_百度知道
电脑没声音了,用诊断工具检查没有找到声卡。
电脑没声音了,用诊断工具检查没有找到声卡。 声卡MPU-401 Compatible MIDI Device显示正常吖
电脑就是没声音。。不知道是没有驱动呢
还是声卡怎么的了
希望各位高手帮帮忙吖````
我有更好的答案
电脑没声音,用诊断工具没找到声卡,基本可以确定是由于驱动未正确安装造成的,具体原因及解决方法如下:为保险起见重新用排除法,排除造成电脑无声的故障。1、音箱、耳机接线是否正确,耳机、音响音量是否静音,如无问题继续检测。2、确保不是静音,查看右下角音量图标没有禁止符号。3、右键打开我的电脑-设备管理器-看看声卡驱动是否是叹号,如果是叹号,重新下载声卡驱动,或者下载驱动精灵等驱动下载软件,重新安装驱动。5、有时候显卡温度过低也会造成系统声音消失的,重新拔插显卡、内存,并擦拭金手指。6、问题还未解决送专业维修店。
人力资源经理
楼主你好:我也碰到过同样的问题,最后终于搞定了,你可以参考一下! 1、音箱接线正确【可以使用MP3测试一下】 2、确保不是静音【右下角音量图标没有禁止符号】 3、安装正确的声卡驱动【到驱动之家找你的驱动】 4、硬盘完全杀毒【无论什么杀毒软件,请使用最新杀毒病毒库】 别急,如果你是电脑重启后有声音,而过会后什么千千静听,播放器啊或者整个系统就是没声音了, 5、请用手摸摸显卡温度,如果有显卡风扇,先拔掉(没事的)风扇看看。 【总结】:有时候显卡温度过低也会造成系统声音消失的,所以有时老问题新方法可以解决哦!试试吧。。。
本回答被提问者采纳
我的电脑属性——硬件——设备管理器看声卡有没有金叹号!有的话可能是驱动问题,安装一下也可能是硬件冲突!
这种情况我也碰见过 你看你的声卡前面是不是有个惊叹号 要是的话就是没有驱动
可能是中病毒了,我也碰到过这样的情况,找个万能的声卡安装上就行了。
给你一个解决电脑没有声音的链接 你可以看一下希望可以解决你的问题
其他3条回答
为您推荐:
其他类似问题
您可能关注的内容
电脑没声音的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
&&& 那我们就按照逻辑顺序来一一展示这个到底是怎么做的。首先是,开始和结束编辑的代码:///&&summary&///&开始编辑///&&/summary&///&&param&name="bWithUndoRedo"&&/param&public&void&StartEditing(bool&bWithUndoRedo){&&&&&if&(m_SelectedLayer&==&null)&return;&&&&&IFeatureLayer&featureLayer&=&m_SelectedLayer&as&IFeatureL&&&&&if&(featureLayer&==&null)&return;&&&&&IFeatureClass&featureClass&=&featureLayer.FeatureC&&&&&if&(featureClass&==&null)&return;&&&&&IDataset&dataset&=&featureClass&as&ID&&&&&IWorkspaceEdit&workspaceEdit&=&dataset.Workspace&as&IWorkspaceE&&&&&try&&&&&{&&&&&&&&&&workspaceEdit.StartEditing(bWithUndoRedo);&&&&&&&&&&m_IsEdited&=&true;&&&&&}&&&&&catch&&&&&&{&&&&&&&&&&return;&&&&&}}&&&&&当然你可以直接传进来IWorkspace,这个可根据你具体的需求,我这里用当前图层获取工作空间。&///&&summary&///&结束编辑///&&/summary&///&&param&name="bSave"&&/param&public&void&StopEditing(bool&bSave){&&&&&if&(m_IsEdited)&&&&&{&&&&&&&&&&m_IsEdited&=&false;&&&&&&&&&&if&(m_SelectedLayer&==&null)&return;&&&&&&&&&&IFeatureLayer&featureLayer&=&m_SelectedLayer&as&IFeatureL&&&&&&&&&&if&(featureLayer&==&null)&return;&&&&&&&&&&IFeatureClass&featureClass&=&featureLayer.FeatureC&&&&&&&&&&if&(featureClass&==&null)&return;&&&&&&&&&&IDataset&dataset&=&featureClass&as&ID&&&&&&&&&&IWorkspaceEdit&workspaceEdit&=&dataset.Workspace&as&IWorkspaceE&&&&&&&&&&if&(workspaceEdit.IsBeingEdited())&&&&&&&&&&{&&&&&&&&&&&&&&&try&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&workspaceEdit.StopEditing(bSave);&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&catch&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&workspaceEdit.AbortEditOperation();&&&&&&&&&&&&&&&&&&&return;&&&&&&&&&&&&&&&}&&&&&&&&&&}&&&&&&}}&&&&&开始编辑已经好了,然后就是鼠标点击要素时候,让其处于选中状态,我这里为了方便控制,我分成了两个函数写,给为看官也可以合并成一个:&public&void&GetFeatureOnMouseDown(int&x,&int&y){&&&m_SelectedFeature.Clear();&&&try&&&{&&&&&&if&(m_SelectedLayer&==&null)&return;&&&&&&IFeatureLayer&featureLayer&=&m_SelectedLayer&as&IFeatureL&&&&&&if&(featureLayer&==&null)&return;&&&&&&IFeatureClass&featureClass&=&featureLayer.FeatureC&&&&&&if&(featureClass&==&null)&return;&&&&&&IPoint&point&=&m_MapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x,&y);&&&&&&IGeometry&geometry&=&point&as&IG&&&&&&double&length&=&ConvertPixelsToMapUnits(4);&&&&&&ITopologicalOperator&pTopo&=&geometry&as&ITopologicalO&&&&&&IGeometry&buffer&=&pTopo.Buffer(length);&&&&&&geometry&=&buffer.Envelope&as&IG&&&&&&ISpatialFilter&spatialFilter&=&new&SpatialFilterClass();&&&&&&spatialFilter.Geometry&=&&&&&&&switch&(featureClass.ShapeType)&&&&&&{&&&&&&&&&case&esriGeometryType.esriGeometryPoint:&&&&&&&&&&&&&&spatialFilter.SpatialRel&=&esriSpatialRelEnum.esriSpatialRelC&&&&&&&&&&&&&&break;&&&&&&&&&case&esriGeometryType.esriGeometryPolygon:&&&&&&&&&&&&&&spatialFilter.SpatialRel&=&esriSpatialRelEnum.esriSpatialRelI&&&&&&&&&&&&&&break;&&&&&&&&&case&esriGeometryType.esriGeometryPolyline:&&&&&&&&&&&&&&spatialFilter.SpatialRel&=&esriSpatialRelEnum.esriSpatialRelC&&&&&&&&&&&&&&break;&&&&&&&}&&&&&&&spatialFilter.GeometryField&=&featureClass.ShapeFieldN&&&&&&&IQueryFilter&filter&=&spatialFilter&as&IQueryF&&&&&&&IFeatureCursor&cursor&=&featureClass.Search(filter,&false);&&&&&&&IFeature&pfeature&=&cursor.NextFeature();&&&&&&&while&(pfeature&!=&null)&&&&&&&{&&&&&&&&&&&m_SelectedFeature.Add(pfeature);&&&&&&&&&&&pfeature&=&cursor.NextFeature();&&&&&&&}&&&}&&&catch&&&{&&&&&&&return;&&&}}///&&summary&///&根据鼠标点击位置使击中要素处于高亮显示状态///&&/summary&///&&param&name="x"&&/param&///&&param&name="y"&&/param&public&void&SelectOnMouseDown(){&&&&try&&&&{&&&&&&&&if&(m_SelectedLayer&==&null)&return;&&&&&&&&m_MapControl.Map.ClearSelection();&&&&&&&&m_MapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,&null,&null);&&&&&&&&foreach&(IFeature&feature&in&m_SelectedFeature.ToArray())&&&&&&&&{&&&&&&&&&&&&&&m_MapControl.Map.SelectFeature(m_SelectedLayer,&feature);&&&&&&&&}&&&&&&&&m_MapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,&null,&null);&&&&}&&&&catch&&&&{&return;&}}&&&&&相信大家对第一个函数并不陌生吧?对的,就是用的空间查询,把点击中的要素放进容器,再用第二个函数进行高亮显示。这个地方注意,如果数据量比较多,强烈推荐用PartialRefresh 而不要用Refresh,参数的含义请参考帮助。&&&&&这个只是开始编辑后,可以用鼠标点击选中要素,使其处于高亮状态,然而,ArcMap里面双击要素怎么出现节点用以编辑呢?这个是要自己绘制到MapControl上面去的:&///&&summary&///&在要素上面绘制一个可拖拽的符号///&&/summary&///&&param&name="geometry"&&/param&public&void&DrawEditSymbol(IGeometry&geometry,&IDisplay&display){&&&&IEngineEditProperties&engineProperty&=&new&EngineEditorClass();&&&&ISymbol&pointSymbol&=&engineProperty.SketchVertexSymbol&as&IS&&&&ISymbol&sketchSymbol&=&engineProperty.SketchSymbol&as&IS&&&&ITopologicalOperator&pTopo&=&geometry&as&ITopologicalO&&&&sketchSymbol.SetupDC(display.hDC,&display.DisplayTransformation);&&&&sketchSymbol.Draw(pTopo.Boundary);&&&&IPointCollection&pointCol&=&geometry&as&IPointC&&&&for&(int&i&=&0;&i&&&pointCol.PointC&i++)&&&&{&&&&&&&&IPoint&point&=&pointCol.get_Point(i);&&&&&&&&pointSymbol.SetupDC(display.hDC,&display.DisplayTransformation);&&&&&&&&pointSymbol.Draw(point);&&&&&&&&pointSymbol.ResetDC();&&&&}&&&&ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(sketchSymbol);&&&&ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(pointSymbol);&&&&ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(engineProperty);}&&&&&注意,这个函数是在MapControl的AfterDraw里面调用的,IDisplay参数,是AfterDraw事件的参数,我这里就没有画出来,类似ArcMap里面还有一个红色的节点,这里全是绿色的,因为红色对我的用处不大,也就没有必要了,当然各位看官可以自行修改,还有就是绘制符号的时候一定要记得释放内存哦~&&&&&现在,编辑状态做好了,但是现在只是雏形,因为它还没有响应任何鼠标事件,当鼠标悬停在绿色的节点上时并不会让你可以拖拽,所以我们还要做点工作。&&&&&那现在就开始如果鼠标悬停在绿色节点上时的代码吧:&public&void&SnapVertex(int&x,int&y,IGeometry&snapContainer,ref&bool&vertexSnaped,ref&bool&contained){&&&&IPoint&point&=&m_MapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x,&y);&&&&IPoint&pHitPoint&=&null;&&&&double&hitDist&=&-1,&tol&=&-1;&&&&int&vertexIndex&=&-1,&partIndex&=&-1;&&&&bool&vertex&=&false;&&&&tol&=&ConvertPixelsToMapUnits(4);&&&&IHitTest&pHitTest&=&snapContainer&as&IHitT&&&&bool&bHit=pHitTest.HitTest(point,&tol,&esriGeometryHitPartType.esriGeometryPartVertex,&pHitPoint,&ref&hitDist,&ref&partIndex,&ref&vertexIndex,&ref&vertex);&&&&vertexSnaped&=&false;&&&&contained&=&false;&&&&if&(bHit)&&&&{&&&&&&&&m_MapControl.MousePointer&=&esriControlsMousePointer.esriPointerC&&&&&&&&vertexSnaped&=&true;&&&&&&&&return;&&&&}&&&&else&&&&&{&&&&&&&&IRelationalOperator&pRelOperator=null;&&&&&&&&ITopologicalOperator&pTopo&=&null;&&&&&&&&IGeometry&buffer&=&null;&&&&&&&&IPolygon&polygon&=&null;&&&&&&&&switch&(snapContainer.GeometryType)&&&&&&&&{&&&&&&&&&&&&&case&esriGeometryType.esriGeometryPolyline:&&&&&&&&&&&&&&&&&&&&&&&&pTopo&=&snapContainer&as&ITopologicalO&&&&&&&&&&&&&&&&&&&&&&&&buffer=pTopo.Buffer(3);&&&&&&&&&&&&&&&&&&&&&&&&polygon&=&buffer&as&IP&&&&&&&&&&&&&&&&&&&&&&&&pRelOperator=polygon&as&&IRelationalO&&&&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&case&esriGeometryType.esriGeometryPolygon:&&&&&&&&&&&&&&&&&&&&&&&&polygon&=&snapContainer&as&IP&&&&&&&&&&&&&&&&&&&&&&&&pRelOperator=polygon&as&&IRelationalO&&&&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&case&esriGeometryType.esriGeometryPoint:&&&&&&&&&&&&&&&&&&&&&&&&pTopo&=&snapContainer&as&ITopologicalO&&&&&&&&&&&&&&&&&&&&&&&&buffer&=&pTopo.Buffer(3);&&&&&&&&&&&&&&&&&&&&&&&&polygon&=&buffer&as&IP&&&&&&&&&&&&&&&&&&&&&&&&pRelOperator&=&polygon&as&IRelationalO&&&&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&default:&&&&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&}&&&&&&&&&if&(pRelOperator&==&null)&return;&&&&&&&&&if&(pRelOperator.Contains(point))&&&&&&&&&{&&&&&&&&&&&&&&m_MapControl.MousePointer&=&esriControlsMousePointer.esriPointerSizeA&&&&&&&&&&&&&&contained&=&true;&&&&&&&&&}&&&&&&&&&else&m_MapControl.MousePointer&=&esriControlsMousePointer.esriPointerA&&&&&&&&&return;&&&}}&&&&&这里就是根据鼠标悬停的位置,来改变鼠标样式,抱歉的很,我没有从AE里面找到和ArcMap一样的鼠标样式,只要用一些简单的替代了,当然你可以自己定义,也可以打电话、发Email质问ESRI客服,如果你知道了,一定要告诉我,否则我诅咒你找不到女朋友!这个函数里面,我需要判断,鼠标是悬停在要素的节点上,还是悬停在要素内部了,这个对于后面处理是拽节点还是移动要素有很大的帮助。&&&&&这个根据鼠标悬停位置改变鼠标样式,还远远不够滴,当你悬停到绿色节点上时,按下鼠标时,就意味这拖拽开始,当鼠标左键按下并移动时,要出现像橡皮筋一样的连接线,当左键弹起时,就意味着拖拽结束,如果再按下左键,就意味着要素的编辑结束。这个怎么做到呢,请看下面的代码:&public&bool&EditFeature(int&x,int&y,IGeometry&geometry){&&&&GetFeatureOnMouseDown(x,&y);&&&&SelectOnMouseDown();&&&&if(m_SelectedFeature.Count&1)return&false;&&&&if&(geometry&==&null)&return&false;&&&&IPoint&pHitPoint=null;&&&&double&hitDist&=&0,&tol&=&0;&&&&int&vertexIndex&=&0,&vertexOffset&=&0,&numVertices&=&0,&partIndex&=&0;&&&&bool&vertex=false;&&&&IFeature&editedFeature&=&m_SelectedFeature[0];&&&&point&=&m_MapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x,&y);&&&&tol&=&ConvertPixelsToMapUnits(4);&&&&//IGeometry&pGeo&=&editedFeature.S&&&&//m_EditingFeature&=&editedF&&&&try&&&&{&&&&&&&switch&(geometry.GeometryType)&&&&&&&{&&&&&&&&&&&case&esriGeometryType.esriGeometryPoint:&&&&&&&&&&&&&&&&&&&&&&&&m_FeedBack&=&new&MovePointFeedbackClass();&&&&&&&&&&&&&&&&&&&&&&&&m_FeedBack.Display&=&m_MapControl.ActiveView.ScreenD&&&&&&&&&&&&&&&&&&&&&&&&IMovePointFeedback&pointMove&=&m_FeedBack&as&IMovePointF&&&&&&&&&&&&&&&&&&&&&&&&pointMove.Start(geometry&as&IPoint,&point);&&&&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&case&esriGeometryType.esriGeometryPolyline:&&&&&&&&&&&if&(TestGeometryHit(tol,&point,&geometry,&ref&pHitPoint,&ref&hitDist,&ref&partIndex,&ref&vertexOffset,&ref&vertexIndex,&ref&vertex))&&&&&&&&&&&{&&&&&&&&&&&&&&&&if(!vertex)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&IGeometryCollection&geometryColl&=&geometry&as&IGeometryC&&&&&&&&&&&&&&&&&&&&&&IPath&path&=&geometryColl.get_Geometry(partIndex)&as&IP&&&&&&&&&&&&&&&&&&&&&&IPointCollection&pointColl&=&path&as&IPointC&&&&&&&&&&&&&&&&&&&&&&numVertices&=&pointColl.PointC&&&&&&&&&&&&&&&&&&&&&&object&missing&=&Type.M&&&&&&&&&&&&&&&&&&&&&&if&(vertexIndex&==&0)&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&object&start&=&1&as&object;&&&&&&&&&&&&&&&&&&&&&&&&&&&&pointColl.AddPoint(point,&ref&start,&ref&missing);&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&else&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&object&objVertexIndex=vertexIndex&as&object;&&&&&&&&&&&&&&&&&&&&&&&&&&&&pointColl.AddPoint(point,&ref&missing,&ref&objVertexIndex);&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&TestGeometryHit(tol,&point,&geometry,&ref&pHitPoint,&ref&hitDist,&ref&partIndex,&ref&vertexOffset,&ref&vertexIndex,&ref&vertex);&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&m_FeedBack&=&new&LineMovePointFeedbackClass();&&&&&&&&&&&&&&&&&m_FeedBack.Display&=&m_MapControl.ActiveView.ScreenD&&&&&&&&&&&&&&&&&ILineMovePointFeedback&lineMove&=&m_FeedBack&as&ILineMovePointF&&&&&&&&&&&&&&&&&lineMove.Start(geometry&as&IPolyline,&vertexIndex,&point);&&&&&&&&&&&}&&&&&&&&&&&else&return&false;&&&&&&&&&&&break;&&&&&&&&&&&case&esriGeometryType.esriGeometryPolygon:&&&&&&&&&&&if&(TestGeometryHit(tol,&point,&geometry,&ref&pHitPoint,&ref&hitDist,&ref&partIndex,&ref&vertexOffset,&ref&vertexIndex,&ref&vertex))&&&&&&&&&&&{&&&&&&&&&&&&&&&&if(!vertex)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&IGeometryCollection&geometryColl&=&geometry&as&IGeometryC&&&&&&&&&&&&&&&&&&&&IPath&path&=&geometryColl.get_Geometry(partIndex)&as&IP&&&&&&&&&&&&&&&&&&&&IPointCollection&pointColl&=&path&as&IPointC&&&&&&&&&&&&&&&&&&&&numVertices&=&pointColl.PointC&&&&&&&&&&&&&&&&&&&&object&missing&=&Type.M&&&&&&&&&&&&&&&&&&&&if&(vertexIndex&==&0)&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&object&start&=&1&as&object;&&&&&&&&&&&&&&&&&&&&&&&&pointColl.AddPoint(point,&ref&start,&ref&missing);&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&else&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&object&objVertexIndex&=&vertexIndex&as&object;&&&&&&&&&&&&&&&&&&&&&&&&pointColl.AddPoint(point,&ref&missing,&ref&objVertexIndex);&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&TestGeometryHit(tol,&point,&geometry,&ref&pHitPoint,&ref&hitDist,&ref&partIndex,&ref&vertexOffset,&ref&vertexIndex,&ref&vertex);&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&m_FeedBack&=&new&PolygonMovePointFeedbackClass();&&&&&&&&&&&&&&&&m_FeedBack.Display&=&m_MapControl.ActiveView.ScreenD&&&&&&&&&&&&&&&&IPolygonMovePointFeedback&polyMove&=&m_FeedBack&as&IPolygonMovePointF&&&&&&&&&&&&&&&&polyMove.Start(geometry&as&IPolygon,&vertexIndex&+&vertexOffset,&point);&&&&&&&&&&&&}&&&&&&&&&&&&else&return&false;&&&&&&&&&&&&break;&&&&&&&&&&&&default:&&&&&&&&&&&&break;&&&&&&&&}&&&&&}&&&&&catch&{return&false;}&&&&&return&true;}public&void&FeatureEditMouseMove(int&x,int&y){&&&if&(m_FeedBack&==&null)&return;&&&IPoint&point&=&m_MapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x,&y);&&&m_FeedBack.MoveTo(point);}public&IGeometry&EndFeatureEdit(int&x,&int&y){&&&&if&(m_FeedBack&==&null)&return&null;&&&&IGeometry&geometry&=&null;&&&&IPoint&point&=&m_MapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x,&y);&&&&if&((m_FeedBack&as&IMovePointFeedback)&!=&null)&&&&{&&&&&&&&&IMovePointFeedback&pointMove&=&m_FeedBack&as&IMovePointF&&&&&&&&&geometry&=&pointMove.Stop()&as&IG&&&&}&&&&else&if&((m_FeedBack&as&ILineMovePointFeedback)&!=&null)&&&&{&&&&&&&&&ILineMovePointFeedback&lineMove&=&m_FeedBack&as&ILineMovePointF&&&&&&&&&geometry&=&lineMove.Stop()&as&IG&&&&}&&&&else&if&((m_FeedBack&as&IPolygonMovePointFeedback)&!=&null)&&&&{&&&&&&&&&IPolygonMovePointFeedback&polyMove&=&m_FeedBack&as&IPolygonMovePointF&&&&&&&&&geometry&=&polyMove.Stop()&as&IG&&&&}&&&&m_FeedBack&=&null;&&&&m_MapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography,&m_SelectedLayer,&null);&&&&return&}&&&&&&呵,这个排版真的是很累啊,无法自动缩进,害的我只能一行一行的移动。第一个函数,自然是点击下绿色节点时触发,意味着,我们的拖拽就开始了;但是,但按着鼠标左键来回移动时怎么处理啊?呵呵,这就是第二个函数的所具备的功能,所以你要在MapControl 的MouseMove事件中添加这个函数;但是当你确定你移动的位置是最佳位置的时候,想停下来怎么办呢?这就是第三个函数来帮你了,也就意味着你的拖拽结束,并返回一个IGeometry,这个IGeometry就是你编辑过后要素的新的几何形状,并且当你移动结束左键弹起的时候,这个新的IGeometry也需要显示出来它的绿色的节点,所以重绘的时候需要这个IGeometry。&&&&&好了,我们快大功告成了,stop!好像还少点东西,对了,我们最终是要把最新的几何形状赋给编辑的要素以实现更新,所以我们还需要下面的这个函数:&&&&&public&bool&UpdateEdit(IGeometry&newGeom){&&&&if&(m_SelectedFeature.Count&&&1)&return&false;&&&&if&(newGeom&==&null)&return&false;&&&&if&(newGeom.IsEmpty)&return&false;&&&&IFeature&feature&=&m_SelectedFeature[0];&&&&IDataset&dataset&=&feature.Class&as&ID&&&&IWorkspaceEdit&workspaceEdit&=&dataset.Workspace&as&IWorkspaceE&&&&if&(!workspaceEdit.IsBeingEdited())&return&false;&&&&workspaceEdit.StartEditOperation();&&&&feature.Shape&=&newG&&&&feature.Store();&&&&workspaceEdit.StopEditOperation();&&&&m_SelectedFeature.Clear();&&&&m_SelectedFeature.Add(feature);&&&&ClearSelection();&&&&return&true;}&&&&&&呵呵,对的,这个函数很简单,就是更新一下编辑要素的几何形状,注意啊,这里我获取当前编辑的要素是从容器中取出来的,这样是不是很方便啊?这样我们就可以更新一个要素了。别忘了最后记得调用StopEditing以保存你的编辑!&&&&&当然,不可能一次性做好,我们需要更人性化一点,我们需要添加撤销和重做:&public&void&UndoEdit()&&&&&&&&{&&&&&&&&&&&&if&(m_SelectedLayer&==&null)&return;&&&&&&&&&&&&IFeatureLayer&featLayer&=&m_SelectedLayer&as&IFeatureL&&&&&&&&&&&&IDataset&dataset&=&featLayer.FeatureClass&as&ID&&&&&&&&&&&&IWorkspaceEdit&workspaceEdit&=&dataset.Workspace&as&IWorkspaceE&&&&&&&&&&&&bool&bHasUndos&=&false;&&&&&&&&&&&&workspaceEdit.HasUndos(ref&bHasUndos);&&&&&&&&&&&&if(bHasUndos)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&workspaceEdit.UndoEditOperation();&&&&&&&&&&&&}&&&&&&&&&&&&ClearSelection();&&&&&&&&}&&&&&&&&public&void&RedoEdit()&&&&&&&&{&&&&&&&&&&&&if&(m_SelectedLayer&==&null)&return;&&&&&&&&&&&&IFeatureLayer&featLayer&=&m_SelectedLayer&as&IFeatureL&&&&&&&&&&&&IDataset&dataset&=&featLayer.FeatureClass&as&ID&&&&&&&&&&&&IWorkspaceEdit&workspaceEdit&=&dataset.Workspace&as&IWorkspaceE&&&&&&&&&&&&bool&bHasUndos&=&false;&&&&&&&&&&&&workspaceEdit.HasRedos(ref&bHasUndos);&&&&&&&&&&&&if&(bHasUndos)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&workspaceEdit.RedoEditOperation();&&&&&&&&&&&&}&&&&&&&&&&&&ClearSelection();&&&&&&&&}&&&&&&呵呵 这个也是很简单,对吧?这里需要给出几个上述函数中用到的辅助函数,这里就不一一阐明了,请各位看官自行分析:private&double&ConvertPixelsToMapUnits(double&pixelUnits){&&&int&pixelExtent&=&m_MapControl.ActiveView.ScreenDisplay.DisplayTransformation.get_DeviceFrame().right-&m_MapControl.ActiveView.ScreenDisplay.DisplayTransformation.get_DeviceFrame().&&&double&realWorldDisplayExtent&=&m_MapControl.ActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.W&&&double&sizeOfOnePixel&=&realWorldDisplayExtent&/&pixelE&&&return&pixelUnits&*&sizeOfOneP}private&bool&TestGeometryHit(double&tol,IPoint&pPoint,IGeometry&geometry,ref&IPoint&pHitPoint,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ref&double&hitDist,&ref&int&partIndex,&ref&int&vertexOffset,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ref&int&vertexIndex,&ref&bool&vertexHit){&&&&&IHitTest&pHitTest&=&geometry&as&IHitT&&&&&pHitPoint&=&new&PointClass();&&&&&bool&last&=&true;&&&&&bool&res&=&false;&&&&&if&(pHitTest.HitTest(pPoint,&tol,&esriGeometryHitPartType.esriGeometryPartVertex,&pHitPoint,&ref&hitDist,&ref&partIndex,&ref&vertexIndex,&ref&last))&&&&&{&&&&&&&&&&vertexHit&=&true;&&&&&&&&&&res&=&true;&&&&&}&&&&&else&&&&&{&&&&&&&&&if&(pHitTest.HitTest(pPoint,&tol,&esriGeometryHitPartType.esriGeometryPartBoundary,&pHitPoint,&ref&hitDist,&ref&partIndex,&ref&vertexIndex,&ref&last))&&&&&&&&&{&&&&&&&&&&&&&&vertexHit&=&false;&&&&&&&&&&&&&&res&=&true;&&&&&&&&&}&&&&&}&&&&&if(partIndex&0)&&&&&{&&&&&&&&&IGeometryCollection&pGeoColl&=&geometry&as&IGeometryC&&&&&&&&&vertexOffset&=&0;&&&&&&&&&for&(int&i&=&0;&i&&&partIi=2*i+1)&&&&&&&&&{&&&&&&&&&&&&&IPointCollection&pointColl&=&pGeoColl.get_Geometry(i)&as&IPointC&&&&&&&&&&&&&vertexOffset&=&vertexOffset&+&pointColl.PointC&&&&&&&&&}&&&&&}&&&&&return&}///&&summary&///&清除要素选择状态,恢复常态///&&/summary&public&void&ClearSelection(){&&&&m_MapControl.Map.ClearSelection();&&&&m_MapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography,&m_SelectedLayer,&null);}&&&&&&各位看官,由于要素的移动、要素的创建和要素编辑在代码逻辑上差不多,所以我就不做过多阐述了,都是在处理鼠标的事件,需要做判断。其实,可能有看官已经了解,在AE的帮助里面就有类似的代码,是的,我参考了这部分代码,并对ESRI的开发和工作人员表示感谢。&&&&&最后,谢谢AE开发群一叶知秋老大哥的帮助,总是在繁忙之中耐心的指导,再次表示感谢。&&&&&希望大家能够有所启发,谢谢大家的支持!&&&&&示例源码下载地址&Tag标签:&
阅读(5581)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_083075',
blogTitle:'ArcMap的Editor工具,实现要素拖动、编辑、节点删除',
blogAbstract:'(源)
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 jsonpath 的文章

 

随机推荐