我正在编写一个 Delphi Altium脚本来删除PCB库中TopOverlay中的所有轨道。
但是,当运行脚本时,什么也不会发生(轨道不会被删除)。
我不知道为什么你能帮帮我吗
下面是我的代码:
procedure RemoveTrackObject;
Var
MyComponent : IPCB_LibComponent;
MyTrack : IPCB_Track;
Iterator : IPCB_GroupIterator;
DeleteList : TInterfaceList;
TrackTemp : IPCB_Track;
i : Integer;
begin
MyComponent := PCBServer.GetCurrentPCBLibrary.CurrentComponent;
//////////////////////////////////////////////////////////////////////
Iterator := MyComponent.GroupIterator_Create;
Iterator.AddFilter_ObjectSet(Mkset(eTrackObject));
Iterator.AddFilter_LayerSet(Mkset(eTopOverLay));
DeleteList := TInterfaceList.Create;
try
MyTrack := Iterator.FirstPCBObject;
While MyTrack <> nil do
begin
DeleteList.Add(MyTrack);
MyTrack := Iterator.NextPCBObject;
end;
finally
MyComponent.GroupIterator_Destroy(Iterator);
end;
try
PCBServer.PreProcess;
for i := 0 to DeleteList.Count - 1 do
begin
TrackTemp := DeleteList.Items[i];
MyComponent.RemovePCBObject(TrackTemp);
end;
finally
PCBServer.PostProcess;
DeleteList.Free;
end;
Client.SendMessage('PCB:Zoom', 'Action=Redraw' , 255, Client.CurrentView);
end;
1条答案
按热度按时间iyfamqjs1#
AFAIU在Altium dephiscript API InterfaceList中有特定用途:持有非PCB对象并传递到外部DLL函数并让接收fn销毁列表。你在这里不需要。
PcbLib确实有一些奇怪的行为,比如从选定/聚焦的封装中删除等。
我认为这个问题是由Pcb编辑器不允许从当前关注的组件/封装中删除对象引起的。围绕这个问题的历史表明,解决方案涉及将焦点从所需组件移开。
当List仍包含对象引用时,无法完成删除过程。
使用While循环,在RemovePCBObject()之后,从List中删除object ref(删除List Item)。然后当While循环终止时,List中的项目为零。
可能有助于刷新或使用其中一些fn调用的外观和感觉: