[CDR 2024] Обрезка нескольких пикселей растрового изображения

как запустить плагин Feather из макроса? я даже готов смириться окном настроек и нажимать каждый раз ок)
dupImage.ApplyEffectBCI -100, 0, 0
dupImage.OrderToFront
dupImage.Bitmap.ApplyBitmapEffect "Feather", .
Через UID соответствующего пункта меню, наверное, но, по мне, так это более шаткий костыль, чем IM
 
как запустить плагин Feather из макроса? я даже готов смириться окном настроек и нажимать каждый раз ок)
На VBA не знаю. На Delphi так:
Код:
uses
  Windows,VGCore_TLB,ActiveX;

var
  CorelCLSID: TGUID;
  CorelApp:   IVGApplication;
  CUIApp:     ICUIApplication;

begin
  CoInitialize(0);
  CLSIDFromProgID('CorelDRAW.Application.20',CorelCLSID);
  CoCreateInstance(CorelCLSID,nil,CLSCTX_LOCAL_SERVER,IVGApplication,CorelApp);
  CorelApp.QueryInterface(IID_ICuiApplication,CUIApp);
  CUIApp.DataContext.GetDataSource('BitmapEffectsDS').InvokeMethod('ON_LOWPASS');
end.
 
Исправляюсь - вот VBA
Код:
FrameWork.Application.DataContext.GetDataSource("EffectsDialogFactoryDS").InvokeMethod("OnFeather")
 
Для установки параметров вроде бы нужно использовать FeatherEffectDS, но у меня не получилось - наверное, что-то не так делаю:
Код:
With FrameWork.Application.DataContext.GetDataSource("FeatherEffectDS")
  .SetProperty "Mode", "Linear"
  .SetProperty "Width", 50
  .UpdateListeners "Mode,Width"
End With
 
Потестировал методы SetProperty/GetProperty на своём SmartDepart. При их вызове должен вызываться метод Invoke с флагами DISPATCH_PROPERTYPUT/DISPATCH_PROPERTYGET, но этого не происходит. UpdateListeners также не вызывает Invoke.
 
У вас же, вроде, аддишн на асме, вы оттуда VBAшные методы вызываете?
 
Я обращался к его DataSource через VBA, предварительно поставив брейкпоинт в методе Invoke.
 
А IDispatch::Invoke это разве не обертка для дотнета?
 
Последнее редактирование:
Интерфейс DataSource наследуется от IDispatch как и все интерфейсы CorelDraw.
 
Точнее это и есть IDispatch. Где то в Corel Community был пример cpg-аддона на плюсах RulerTool - вот строчка из него
C++:
IDispatch* DataSourceFactory::GetDataSource(CString name)
 
Код:
Sub Duple()
    Dim origImage As Shape
    Dim dupImage As Shape
  
    Set origImage = ActiveSelection.Shapes(1)
       
    origImage.Duplicate 0, 0
    Set dupImage = ActiveSelection.Shapes(1)
    
    Set dup = dupImage.ConvertToBitmapEx(2, False, True, 300, 1, True, False, 95)
    dup.ApplyEffectBCI -100, 0, 0
    dup.OrderToFront
    dup.CreateSelection
    Application.FrameWork.Automation.InvokeItem "0a76cfa2-35ee-453a-8996-e45237d5793f"
    
    Application.Refresh
End Sub
b
дублирую картинку, выкручиваю контраст, растрирую в оттенки серого, двигаю на передний план.
а далее инвоком вызываю фильтр.
работает вполне себе.
и никуда по меню лазать ненужно